数据结构
什么是数据结构
是指相互之间具有(存在)一定联系(关系)的数据元素的集合。
数据结构的存储方式
**顺序存储结构:**用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结
构(关系)。
链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针
(pointer ),用该指针来表示数据元素之间的逻辑结构(关系)。
逻辑结构和物理结构
四种基本类型
集合:结构中的数据元素除了“同属于一个集合”外,没有其它关系。
线性结构:结构中的数据元素之间存在一对一的关系。
树型结构:结构中的数据元素之间存在一对多的关系。
图状结构或网状结构:结构中的数据元素之间存在多对多的关系
线性表
1 线性结构
是最常用,最简单的一种结构
① 存在一个唯一的被称为“第一个”的数据元素;
② 存在一个唯一的被称为“最后一个”的数据元素;
③ 除第一个元素外,每个元素均有唯一一个直接前驱;
④ 除最后一个元素外,每个元素均有唯一一个直接后继。
双向列表
双向链表(Double Linked List) 指的是构成链表的每个结点中设立两个指针域,一个指向其直接前趋的指针域 prior,一个指向其直接后继的指针域 next。这样形成的链表中有两个方向不同的链,故称为双向链表
栈的基本概念
栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出 FILO (First In Last Out)线性表。
栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指
示栈顶元素。
栈底(Bottom):是固定端,又称为表头。
空栈:当表中没有元素时称为空栈
树
树型结构是一类非常重要的非线性结构。
树(Tree)是 n(n≧0)个结点的有限集合 T,若 n=0 时称为空树,否则:
有且只有一个特殊的称为树的根(Root)结点;
若 n>1 时,其余的结点被分为 m(m>0)个互不相交的子集 T1, T2, T3…Tm,其中每
个子集本身又是一棵树,称其为根的子树(Subtree)
二叉树
性质 1:在非空二叉树中,第 i 层上至多有 2i 个结点(i≧1)。
性质 2:深度为 k 的二叉树至多有 2k-1 个结点(k≧1) 。
性质 3:对任何一棵二叉树,若其叶子结点数为 n0,度为 2 的结点数为 n2,则
n0=n2+1。
满二叉树
所有的支点上都有左,右子数
完全二叉树
查找算法
顺序查找
#顺序查找
def fun(list,elemt):
for i in range(len(list)):
if elemt == list[i]:
print(list[i])
print(i)
list1 = [1,2,3,4,5,7]
fun(list1,3)#3 2
二分法查找
#二分查找
def fun(star,stop,list,elemt):
mid = (star+stop)//2
if star > stop :
return -1
if list[mid] == elemt:
return mid
elif list[mid] > elemt:
return fun(star,mid-1,list,elemt)
else:
return fun(mid+1,stop,list,elemt)
list1 = [1,2,3,4,5]
print(fun(0,len(list1),list1,4))#3
排序
冒泡排序
#冒泡排序(递归)
def fun(list):
for i in range(len(list)-1):
for j in range(len(list)-i-1):
if list[j] < list[j+1]:
list[j],list[j+1] = list[j+1],list[j]
print(list)
list1 = [1,3,5,2,7,5,4,9]
fun(list1)#[9, 7, 5, 5, 4, 3, 2, 1]
设计排序
#设计排序
def fun(list):
list1 = []
list2 = []
a = max(list)
b = min(list)
for i in range(a-b+1):
list1.append([])
for h in range(len(list)):
list1[list[h]-b].append(list[h])
for j in list1:
for b in j:
list2.append(b)
print(list2)
list5 = [2,3,4,7,8,5,6,4,5]
fun(list5)#[2, 3, 4, 4, 5, 5, 6, 7, 8]