📜  数据结构概述|设置3(图形,特里,分段树和后缀树)

📅  最后修改于: 2021-04-17 13:49:30             🧑  作者: Mango

我们在下面的前两组中讨论了数据结构。

集合1:数组,链接列表,队列和堆栈的概述。
第2组:二叉树,BST,堆和哈希的概述。

9.图
10.特里
11.段树
12.后缀树

图形

Graph是一种数据结构,由以下两个组件组成:

  1. 一组有限的顶点,也称为节点。
  2. 形式为(u,v)的有限对有序对集合,称为边。该对是有序的,因为在有向图(di-graph)情况下(u,v)与(v,u)不相同。形式对(u,v)表示存在从顶点u到顶点v的一条边。这些边可能包含权重/值/成本。

V->顶点数。
E->边数。

可以根据许多事物对图进行分类,以下是两种最常见的分类:

  1. 方向 :
    无向图:所有边都是双向的图。有向图:所有边都是单向的图。
  2. 重量 :
    加权图:权重与边缘相关联的图。非加权图:权重与边缘无关联的图。

图可以多种方式表示,以下是两种最常见的表示方式:

让我们以下面的示例图二看图的两种表示。

  1. 上图的邻接矩阵表示

  2. Adjacency List Representation of Graph

    上图的邻接表表示

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)将所有后缀视为单个单词,并构建压缩的特里。

示例:用于查找字符串所有出现的模式。它也可以用来寻找最长的重复子(文本时不经常更改),最长的公共子,并在字符串中最长的回文。