数据结构汇总

https://blog.csdn.net/m0_37568814/article/details/81288756

https://zhuanlan.zhihu.com/p/138523723

1 分类

数据结构包括:逻辑结构,存储结构,数据运算

数据的逻辑结构主要分为线性结构和非线性结构。

  • 线性结构:数据结构的元素之间存在一对一线性关系,所有结点都最多只有一个直接前趋结点和一个直接后继结点。常见的有数组、队列、链表、栈。
  • 非线性结构:各个结点之间具有多个对应关系,一个结点可能有多个直接前趋结点和多个直接后继结点。常见的有多维数组、广义表、树结构和图结构等。

数据的存储结构,表示数据元素之间的逻辑关系,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有:

  • 顺序存储:存储顺序是连续的,在内存中用一组地址连续的存储单元依次存储线性表的各个数据元素。
  • 链式存储:在内存中的存储元素不一定是连续的,用任意地址的存储单元存储元素,元素节点存放数据元素以及通过指针指向相邻元素的地址信息。
  • 索引存储:除建立存储结点信息外,还建立附加的索引表来标识节点的地址。索引表由若干索引项组成。
  • 散列存储:又称Hash存储,由节点的关键码值决定节点的存储地址。

2 常用的数据结构

  • 数组(Array)
  • 队列(Queue)
  • 链表(Linked List)
  • 栈(Stack)
  • 树(Tree)
  • 散列表(Hash)
  • 堆(Heap)
  • 图(Graph)

单调栈

分类

单调栈也分为单调递增栈单调递减栈

  • 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小
  • 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大

举例:单调递增栈

现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空或入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。

10入栈时,栈为空,直接入栈,栈内元素为10。

3入栈时,栈顶元素10比3大,则入栈,栈内元素为10,3。

7入栈时,栈顶元素3比7小,则栈顶元素出栈,此时栈顶元素为10,比7大,则7入栈,栈内元素为10,7。

4入栈时,栈顶元素7比4大,则入栈,栈内元素为10,7,4。

12入栈时,栈顶元素4比12小,4出栈,此时栈顶元素为7,仍比12小,栈顶元素7继续出栈,此时栈顶元素为10,仍比12小,10出栈,此时栈为空,12入栈,栈内元素为12。

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stack<int> st;
//单调递增栈
for (遍历这个数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素)
{
入栈;
}
else
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
}

应用

主要用于$O(n)$ 解决NGE问题(Next Greater Element)

  • 比当前元素更大的下一个元素
  • 比当前元素更大的前一个元素
  • 比当前元素更小的下一个元素
  • 比当前元素更小的前一个元素

参考

https://blog.csdn.net/lucky52529/article/details/89155694

字典树

一.核心思想

Trie tree,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。字典树的查询时间复杂度是O (L),L是待查字符串的长度。如果是普通的线性表结构,那么查询效率为O(NL),N为待查数据集的大小。

假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,那我们创建字典树如下:

二.应用

目的:利用汉语拼音缩写还原中文汉字

准备:数据集(包含中文汉字以及对应汉语缩写)

思想:1.基于汉语拼音缩写检索出数据集中对应的所有中文汉字 2.基于中文汉字出现频次排序,将top1作为汉语拼音的还原结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import  pandas as pd
import pickle
import os
import joblib

class TrieNode(object):
def __init__(self):
"""
Initialize your data structure here.
"""
self.data = {}###字母字符
self.data1={}###中文
self.is_word = False###标识是否汉字


class Trie(object):

def __init__(self):
self.root = TrieNode()

def insert(self, word,word1):
"""
Inserts a word into the trie.
:type word: str
:rtype: void
"""
node = self.root
for letter in word:
child = node.data.get(letter)
if not child:
node.data[letter] = TrieNode()
node = node.data[letter]
node.is_word = True
if word1 not in node.data1:
node.data1[word1]=1
else:
node.data1[word1]+=1

def search(self, word):
"""
Returns if the word is in the trie.
:type word: str
:rtype: bool
"""
node = self.root
for letter in word:
node = node.data.get(letter)
if not node:
return False
return node.is_word

def starts_with(self, prefix):
"""
Returns if there is any word in the trie
that starts with the given prefix.
:type prefix: str
:rtype: bool
"""
node = self.root
for letter in prefix:
node = node.data.get(letter)
if not node:
return False
return True

def get_start(self, prefix):
"""
Returns words started with prefix
:param prefix:
:return: words (list)
"""
def _get_key(pre, pre_node):
words_list = []
if pre_node.is_word:
words_list.append([pre,pre_node.data1])
for x in pre_node.data.keys():
words_list.extend(_get_key(pre + str(x), pre_node.data.get(x)))
return words_list

words = []
if not self.starts_with(prefix):
return words
# if self.search(prefix):
# words.append(prefix)
# return words
node = self.root
for letter in prefix:
node = node.data.get(letter)
return _get_key(prefix, node)


def find_result(self,string):
result =self.get_start(string)
result = sort_by_value(result[0][1])
result.reverse()
return result[0]


def sort_by_value(d):
return sorted(d.items(), key=lambda k: k[1]) # k[1] 取到字典的值。



def build_tree(data,save_path):

trie = Trie()
for element in data.values:
trie.insert(element[0], element[1])
joblib.dump(trie, save_path)
return

def load_tree(path):
trie = joblib.load(path)
return trie

if __name__ == '__main__':

###
build_tree(data,save_path)
###
tree=load_tree(save_path)
print(tree.find_result("XXXXXXXX"))

参考

https://zhuanlan.zhihu.com/p/28891541


:D 一言句子获取中...