1.数据结构是什么?
数据结构就是设计数据以何种方式存储在计算机中,我们所说的程序就是数据结构与算法的结合。
数据类型:满足特定结构定义的一类集合上的总称算是一种数据类型,一个值的集合和定义在这个值上操作的总称。如:int,str,boolean,byte等
数据结构:栈,队,链表,树,图,堆,散列表等
数据结构研究的三个方面:
(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;
(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;
(3)对各种数据结构进行的运算。
数据的逻辑结构: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。
数据的存储结构:有顺序,散列,链接式,索引等。
线性结构条件: (1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。
非线性结构:不满足线性结构条件的数据结构。
栈(栈是一种只能在一端进行插入或者删除的数据结构)
特性:后进先出
python代码实现(自定栈,模拟进栈,取栈顶元素,出栈)
class stack(object):
def __init__(self):
self.stack=[]
#压栈
def push(self,i):
self.stack.append(i)
#获取栈顶元素
def top(self,i):
return self.stack[-1]
#出栈
def pop(self)
self.stack.pop()
队列(在一端插入数据,在另一端删除的数据结构,插入的一段为队尾插入动作为入队,删除的一端为队头,删除动作为出队)
特性:先进先出,(双向队列两端都可以进行入队和出队)
python代码实现(自定队列,模拟入队,取队列元素,出队)
from queue import Queue
# 最大队列限制,入队时不能超过最大限制,不然会阻塞,知道有元素出队,才会再次入队
q = Queue(maxsize=5)
for i in range(5):
q.put(i)
print(q.queue)
for i in range(5):
q.get()
print(q.queue)
链表(单链表)(链表中每个元素都是一个对象,每个对象都是一个节点)
特性:链表分为数据域(存放当前节点数据)和指针域(指向下一节点的内存地址)
class Linked_list():
def __init__(self,value,next=None):
self.value=value
self.next=next
l = Linked_list(1)
l.next = Linked_list(2)
l.next.next = Linked_list(3)
print(l.value) # 1
print(l.next.value) # 2
print(l.next.next.value) # 3
数组(类似与python中的列表,相同类型数据的按照一定顺序排列的集合,注意列表数据类型可以不同)
特性:其存储数据按顺序存储,so内存地址也是连续的,查(易,内存地址连续寻找简单),增删改(难)
字典(python的内置数据类型,存储的数据类型必须是不可变的,以键值对的方式存在例如{“key1”:“value1”,“key2”:“value2”},索引键==>值,字典底层是通过哈希表实现的,也称为哈希数组/散列数组,本质是数组)
特性:字典是一种可变,无序容器结构,空间换时间,so查询速度很快。
字典结构:如下
#开辟空间存储数据
hash_table = [
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
]
hash函数计算hash值
dict = {"name1":"小白","name2":"小黑"}
# 通过把每个对象的关键字key作为自变量,通过一个哈希函数hash(key),将k映射到下标h(key)处,并将此对象存储在这个位置。
print(bin(hash("name1")),bin(hash("name1")))
>>> -0b100000111100100001000101101001110000011010000010010001111010011 -0b100000111100100001000101101001110000011010000010010001111010011
hash函数计算的值是多少就存储在什么位置,没法做到有序,而却这种方法也很容易让哈希表稀疏,占用大量内存。
hash_table = [
['--', '--', '--'],
[hash, name1, 小白],
['--', '--', '--'],
['--', '--', '--'],
[hash, name2, 小黑],
]
hash冲突:没有完美的算法,通过hash函数计算或多或少会产生hash冲突(值相同)
解决办法:开放寻址法,链地址法(拉链法),再哈希法,建立公共溢出区
有序字典:有序的字典把索引和哈希值、键、值单独分开
indices = [None, None, index,]
hash_table = [
[hash0, key0, value0],
[hash1, key1, value1],
[hash2, key2, value2]
]
树(它是由 n (n>=1)个有限节点组成一个具有层次关系的 集合,根朝上,枝朝下)
特性:非线性数据结构,存储一对多的数据元素的集合
树的种类:无序树,有序树,二叉树,满二叉树,完全二叉树,完满二叉树,霍夫曼树,二叉查找树,平衡二叉树,AVL树,红黑树,伸展树,替罪羊树,B树,B+树,B*树,字典树,线索二叉树
class tree():
def __init__(self,root=None,left=None,right=None):
self.root = root
self.left = left
self.right = right
t = tree("a",tree("b"tree("d"),tree("e")),tree("c",tree("f"),tree("g")))
B+树
hash树
红黑树