python数据结构及算法

python数据结构及算法

一. 数据结构与算法

1. 算法的概念:算法是独立存在的一种解决问题的方法和思想
2. 算法的特征:输入,输出,有穷性,确定性,可行性
3. 时间复杂度是实现算法程序所需要的时间,即算法的优劣
4. 数据结构是指数据对象中数据元素之间的关系
5. 程序 = 数据结构 + 算法
6. 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体

二. 顺序表

1. 顺序表:将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
2. 元素的物理地址 = 首地址 + 元素下标 * 存储单元大小
3. 顺序表分为一体式结构和分离式结构
4. 元素存储区替换:一体式结构需要移动整个数据区;分离式结构只需要移动数据区域链接地址即可

三. 链表

1. 将元素存放在通过链接构造起来的一系列存储块中,在每个结点存放下一个结点的地址
2. 单链表:单链表包含两个域,一个信息域,一个链接域(指向下一个节点)
3. 信息域存放具体的数据,链接域存放下一个结点的地址
4. 单链表操作:
操作功能
is_empty链表是否为空
length()链表长度
travel()遍历整个链表
add(item)链表头部添加元素
qppend(item)链表尾部添加元素
insert(位置,item)指定位置添加元素
remove(item)删除节点
search()item*查找节点是否存在
5. 单向循环链表:在单链表的尾部增加了一个指向头结点的链接
6. 双向链表:每个节点都包括一个数据域和两个链接域(一个指向前驱节点,一个指向后继节点)

四. 栈

1. 特点:只允许在容器的一端进行加入数据和输出数据(后进先出)
2. 栈的操作:
操作功能
stack()创建一个新的空栈
push(item)添加一个新的元素item到栈顶
pop()弹出栈顶元素
peek()返回栈顶元素
is_empty判断栈是否为空
size()返回栈的元素个数

五. 队列

1. 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表(先进先出)
2. 双端队列:可以在任意一端入队和出队
3. 队列操作:
操作功能
Deque()创建一个空的双端队列
add_from(item)在队头加入一个item元素
add_rear(item)在队尾加入一个item元素
remove_rear()在队尾删除一个item元素
is_empty判断双端队列是否为空
size()返回队列大小

六. 排序与搜索

排序算法是一种能将一串数字依照特定的顺序排列的一种算法

1. 冒泡排序

方法:把数组从前往后,两两比较,较大的数放在最后一位;每轮得到一个最大值且不参与下一轮排序,直到所有数字排序完毕
稳定性:稳定
代码如下:
def bubble_sort(alist):
	"""冒泡排序"""
	
	n = len(alist)
	for j in range(n-1):
		count = 0
		for i in range(0,n-1):
			"""序列从头走到尾"""
			if alist[i] > alist[i+1]:
				alist[i],alist[i+1] = alist[i+1],alist[i]
				count += 1
		if 0 == count:
			return

2. 选择排序

方法:每一轮找出一个最小值与第一个数交换,第二轮在除了第一个数外其余数里找一个最小的与第二个数交换,依此类推
稳定性:不稳定
代码如下:
def select_sort(alist):
	"""选择排序"""

	n = len(alist)
	for j in range(n-1):
		min_index = j
		for i in range(j,n):
			if alist[min_index] > alist[i]:
				min_index = i
		alist[j],alist[min_index] = alist[min_index],alist[j]

3. 插入排序

方法:第一轮在前两个数种寻找最小值插入到第一个数,第二轮从前三个数里找最小值插入到第一个数,依此类推
稳定性:稳定
代码如下:
def insert_sort(alist):
	"""插入排序"""

	n = len(alist)
	for j in range(1,n):
		i = j
		while i > 0:
			if alist[i] < alist[i-1]:
				alist[i],alist[i-1] = alist[i-1],alist[i]
				i -= 1
			else:
				break 

4. 快速排序

方法:首先,把第一个数设置为基数,使用high和low下标,low在头(但不指向基数),high在尾,向中间移动,移动规则为low向后移动,遇到比基数大的停止,high遇到比基数小的停止,当high和low都停止时,二者交换,继续往中间移动,直到二者重合,把基数插入到重合点前;第二轮把数列以基数为中心分为两部分,继续进行相同操作
稳定性:不稳定
代码如下:
def quick_sort(alist,first,last):
	"""快速排序"""
	
	if first >= last:
		return

	mid_value = alist[first]
	low = first
	high = last

	while low < high:
		while low < high and alist[high] >= mid_value:
			high -= 1
		alist[low] = alist[high]
		while low < high and alist[low] < mid_value:
			low += 1
		alist[high] = alist[low]
	alist[low] = mid_value

	quick_sort(alist,first,low-1)
	quick_sort(alist,low+1,last)

5. 希尔排序

方法:第一轮将数列分为以n//2为一组,每部分的对应位置进行插入排序;第二轮分为n//2//2部分,继续进行相同操作,直到分成n部分
稳定性:不稳定
代码如下:
def shell_sort(alist):
	"""希尔排序"""

	n = len(alist)
	gap =  n//2

	while gap > 0:
		for j in range(gap,n):
			i=j
			while i>0:
				if alist[i] < alist[i-gap]:
					alist[i],alist[i-gap] = alist[i-gap],alist[i]
					i -= gap
				else:
					break
		gap //= 2

6. 归并排序

方法:把数组先分为n/2为一组,再分为n/2/2为一组,直到n/n为一组,再把数字两两合并,第一次合并时,合并成2个为一组,根据左下标和右下标比较,较小的数先输出,直到一组数据为空,另一组数直接插入,第二次合并时,合并成4个为一组,直到一组数为空
稳定性:稳定
代码如下:
def merge_sort(alist):
	"""归并排序"""

	n = len(alist)
	if n<=1:
		return alist

	mid=n//2
	left_li=merge_sort(alist[:mid])
	right_li=merge_sort(alist[mid:])

	left_pointer,right_pointer=0,0
	result=[]

	while left_pointer < len(left_li)	and right_pointer < len(right_li):
		if left_li[left_pointer] < right_li[right_pointer]:
			result.append(left_li[left_pointer])
			left_pointer+=1
		else:
			result.append(right_li[right_pointer])
			right_pointer+=1

	result+=left_li[left_pointer:]
	result+=right_li[right_pointer:]
	return result

7. 搜索

二分查找也叫折半查找,只能作用到顺序表
特点:比较次数少,速度快

七. 树与树算法

度:一个节点含有的子树的个数

树的度:最大的节点含有的子树的个数

节点的层次:从根开始定义,根为第一层,跟的子节点为第二层,依此类推

有序树分为:二叉树,霍夫曼树,B树

1. 二叉树
分类:二叉树分为完全二叉树,满二叉树,平衡二叉树(子树层次相差不大于1),排序二叉树(左小右大)
性质:在二叉树的第i层上至多有2^(i-1)个节点;
深度为k的二叉树至多有2^k-1个节点;
对于任意一颗二叉树,如果其叶子节点数为NO,而度数为2的节点总数为N2,则NO=N2+1;
具有n个节点的完全二叉树的深度为log2(n+1)
2. 树的遍历
分类:先序遍历;中序遍历;后序遍历
先序遍历先遍历根节点,再遍历左子树,再遍历右子树
中序遍历先遍历左子树,再遍历根节点,再遍历右子树
后序遍历先遍历左子树,再遍历右子树,再遍历根节点
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
答案: 数据结构与算法Python中是非常重要的概念。数据结构是指在计算机中存储和组织数据的方式,而算法是指解决问题的一系列步骤。在Python中,我们可以使用各种数据结构算法来处理和操作数据。 在Python中,可以使用列表、元组、字典、集合等数据结构来存储和处理数据。这些数据结构具有不同的特点和用途,可以根据具体的需求选择合适的数据结构来存储和操作数据。 算法可以通过编写函数和类来实现。在Python中,我们可以使用类来实现抽象数据类型,例如通过定义一个类来表示有理数。在这个类中,可以定义各种方法来实现有理数的加法、最大公约数的计算等操作。 在Python中,代码的复杂度也是需要考虑的。复杂度包括时间复杂度和空间复杂度。时间复杂度是指算法运行所需要的时间的度量,而空间复杂度是指算法运行所需要的内存空间的度量。我们可以通过分析代码来估计算法的复杂度,并选择合适的算法来解决问题。 综上所述,数据结构与算法Python中是密不可分的。通过合理地选择数据结构算法,我们可以更高效地处理和操作数据。同时,我们也需要考虑代码的复杂度,以便在解决问题时能够更高效地运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数据结构与算法python)](https://blog.csdn.net/m0_53592642/article/details/119653390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值