我们在下面的前两组中讨论了数据结构。
集合1:数组,链接列表,队列和堆栈的概述。
第2组:二叉树,BST,堆和哈希的概述。
9.图
10.特里
11.段树
12.后缀树
Graph是一种数据结构,由以下两个组件组成:
- 一组有限的顶点,也称为节点。
- 形式为(u,v)的有限对有序对集合,称为边。该对是有序的,因为在有向图(di-graph)情况下(u,v)与(v,u)不相同。形式对(u,v)表示存在从顶点u到顶点v的一条边。这些边可能包含权重/值/成本。
V->顶点数。
E->边数。
可以根据许多事物对图进行分类,以下是两种最常见的分类:
- 方向 :
无向图:所有边都是双向的图。有向图:所有边都是单向的图。 - 重量 :
加权图:权重与边缘相关联的图。非加权图:权重与边缘无关联的图。
图可以多种方式表示,以下是两种最常见的表示方式:
让我们以下面的示例图二看图的两种表示。
Time Complexities in case of Adjacency Matrix :
Traversal :(By BFS or DFS) O(V^2)
Space : O(V^2)
Time Complexities in case of Adjacency List :
Traversal :(By BFS or DFS) O(V + E)
Space : O(V+E)
示例:该图最常见的示例是查找任何网络中的最短路径。用于Google地图或Bing。图的另一个常见应用是社交网站,其中朋友的建议取决于中间建议和其他事物的数量。
特里
Trie是用于在词典中搜索单词的有效数据结构,Trie的搜索复杂度在要搜索的单词(或关键字)长度方面是线性的。如果我们将密钥存储在二进制搜索树中,那么平衡良好的BST将需要与M * log N成比例的时间,其中M是最大字符串长度,N是树中密钥的数量。使用trie,我们可以搜索O(M)时间的密钥。因此它比BST快得多。
散列还提供平均O(n)时间的单词搜索。但是Trie的优点是没有冲突(如哈希),因此最坏情况下的时间复杂度为O(n)。另外,最重要的是前缀搜索。使用Trie,我们可以找到所有以前缀开头的单词(散列是不可能的)。 Tries的唯一问题是它们需要大量的额外空间。尝试也称为基数树或前缀树。
The Trie structure can be defined as follows :
struct trie_node
{
int value; /* Used to mark leaf nodes */
trie_node_t *children[ALPHABET_SIZE];
};
root
/ \ \
t a b
| | |
h n y
| | \ |
e s y e
/ | |
i r w
| | |
r e e
|
r
The leaf nodes are in blue.
Insert time : O(M) where M is the length of the string.
Search time : O(M) where M is the length of the string.
Space : O(ALPHABET_SIZE * M * N) where N is number of
keys in trie, ALPHABET_SIZE is 26 if we are
only considering upper case Latin characters.
Deletion time : O(M)
示例: Tries的最常见用法是由于前缀搜索功能而实现字典。尝试也非常适合实现近似匹配算法,包括在拼写检查中使用的算法。它还用于从“移动联系人”列表或“电话簿”中搜索联系人。
段树
当对一组值进行大量查询时,通常会实现此数据结构。这些查询涉及给定集合的输入范围上的最小值,最大值,总和等。查询还涉及更新给定集中的值。段树是使用数组实现的。
Construction of segment tree : O(N)
Query : O(log N)
Update : O(log N)
Space : O(N) [Exact space = 2*N-1]
示例:当我们需要在范围内查找数字的最大值/最小值/总和/乘积时使用。
后缀树
后缀树主要用于搜索文本中的模式。这个想法是对文本进行预处理,以使搜索操作可以在时间上以图案长度为线性。模式搜索算法(例如KMP,Z等)所花费的时间与文本长度成正比。这确实是一个很大的改进,因为模式的长度通常比文本小得多。
想象一下,我们已经存储了威廉·莎士比亚的全部作品并对其进行了预处理。您可以在整个工作中按与模式长度成正比的时间搜索任何字符串。但是,当文本频繁更改(例如文本编辑器等)时,使用后缀树可能不是一个好主意。
后缀树是所有后缀的压缩特里,因此下面是非常抽象的步骤,用于根据给定的文本构建后缀树。
1)生成给定文本的所有后缀。
2)将所有后缀视为单个单词,并构建压缩的特里。
示例:用于查找字符串所有出现的模式。它也可以用来寻找最长的重复子(文本时不经常更改),最长的公共子,并在字符串中最长的回文。