数据结构与算法(Python)
一.数据结构与算法概述
数据结构与算法的定义
我们把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应操作也叫做算法.
数据结构 = 个体 + 个体的关系
算法 = 对存储数据的操作
二.衡量算法的标准
时间复杂度 指的是大概程序执行的次数,并非程序执行的时间
空间复杂度 指的是程序执行过程中,大概所占有的最大内存
常用的查找
顺序查找
lowB for循环
时间复杂度 O(n)
def linerSearch(li,val):
for i in range(len(li)):
if li[i] == val:
return i
顺序查找
二分查找
二分查询的列表必须有序!
时间复杂度 O(logn)
# 递归
def binarySearch(li,low,high,val):
if low < high:
mid = (low+high) // 2
if li[mid]==val:
return mid
elif li[mid]<val:
binarySearch(li,mid+1,high,val)
elif li[mid]>val:
binarySearch(li,low,mid-1,val)
else:
return -1 # 循环
def binary_search(li,value):
low = 0
high = len(li)
while low <= high:
mid = (low+high)//2
if li[mid] == value:
return mid
elif li[mid] > value:
high = mid -1
else:
low = mid +1
二分查找
常用的几个排序
冒泡排序
时间复杂度:O(n2)
def BubbleSort(li):
for i in range(len(li)):
flag = False
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
flag = True
if not flag:
return li
冒泡排序
选择排序
时间复杂度:O(n2)
def selectSort(li):
for i in range(len(li)):
for j in range(i+1,len(li)):
if li[i] > li[j]:
li[i],li[j] = li[j],li[i]
print(li)
选择排序
插入排序
时间复杂度:O(n2)
def insertSort(li):
for i in range(1,len(li)):
tmp = li[i]
j = i - 1
while j>=0 and li[j]>tmp:
li[j+1] = li[j]
j-=1
li[j+1]=tmp
print(li)
插入排序
快速排序
时间复杂度:O(nlogn)
# 一次调整
def partition(li,left,right):
tmp = li[left]
while left <right:
while left < right and li[right]>=tmp:
right=right - 1
li[left] = li[right]
while left < right and li[left] <= tmp:
left+=1
li[right] = li[left]
li[left] = tmp
return left # 快速排序
def quickSort(li,left,right):
if left < right:
mid = partition(li, left, right) ### O(n)
quickSort(li, left, mid - 1) ### O(logn)
quickSort(li, mid + 1, right)
快速排序
归并排序
时间复杂度:O(nlogn)
# 一次归并
def merge(li,low,mid,right):
i = low
j = mid +1
ltmp = []
while i <= mid and j <=right:
if li[i] <li[j]:
ltmp.append(li[i])
i = i + 1
else:
ltmp.append(li[j])
j = j + 1
while i <= mid:
ltmp.append(li[i])
i = i + 1
while j <= right:
ltmp.append(li[j])
j = j + 1
li[low:right + 1] =ltmp def mergeSort(li, low, high):
if low < high:
mid = (low + high) // 2
mergeSort(li, low, mid)
mergeSort(li, mid + 1, high)
print('归并之前:', li[low:high+1])
merge(li, low, mid, high)
print('归并之后:', li[low:high + 1])
归并排序
希尔排序
时间复杂度:O(nlogn)
def shell_sort(li):
gap = len(li)//2
while gap > 0 :
for i in range(gap,len(li)):
tmp = li[i]
j = i -gap
while j>=0 and tmp <li[j]:
li[j + gap ] = li[j]
j -= gap
li[j + gap] = tmp
gap //= 2
希尔排序
计数排序
时间复杂度:O(nlogn)
def countSort(li):
li_new=[]
count = [0 for i in range(len(li))]
for i in li:
count[i]+=1 for index,val in enumerate(count):
print(index,val)
for i in range(val):
li_new.append(index)
print(li_new)
计数排序
排序小结
|
排序方法 |
时间复杂度 |
稳定性 |
代码复杂度 |
||
|
最坏情况 |
平均情况 |
最好情况 |
|||
|
冒泡排序 |
O(n2) |
O(n2) |
O(n) |
稳定 |
简单 |
|
直接选择排序 |
O(n2) |
O(n2) |
O(n2) |
不稳定 |
简单 |
|
直接插入排序 |
O(n2) |
O(n2) |
O(n2) |
稳定 |
简单 |
|
快速排序 |
O(n2) |
O(nlogn) |
O(nlogn) |
不稳定 |
较复杂 |
|
堆排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
不稳定 |
复杂 |
|
归并排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
稳定 |
较复杂 |
|
希尔排序 |
O(1.3n) |
不稳定 |
较复杂 |
||
三.数组与链表
数据结构与算法(Python)的更多相关文章
- 数据结构与算法-Python/C(目录)
第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 学习笔记:[算法分析]数据结构与算法Python版[基本的数据结构-上]
线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个 ...
- 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...
- 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现
Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...
- 【数据结构与算法Python版学习笔记】算法分析
什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现
无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...
随机推荐
- 【博客迁移】hyrepo.com
博客迁移至 www.hyrepo.com
- 微信小程序支付异常:requestPayment:fail no permission
今天在调试微信小程序支付时碰到了这个问题,支付参数都正常生成了,在调用 wx.requestPayment 进行支付时遇到了这个报错,查了一下发现是开发者工具中 AppID 写错了,用的 AppID ...
- centos6.5 squid安装
squid作用 1正向代理 标准的代理缓冲服务器,须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号. 透明代理缓冲服务器,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和 ...
- 【Python3练习题 020】 求1+2!+3!+...+20!的和
方法一 import functools sum = 0 for i in range(1,21): sum = sum + functools.reduce(lambda x,y: x* ...
- react组件传值传方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Velocity ${} 和$!{}、!${}区别
前言 在使用Velocity时经常会看到三种使用变量的情况 情况一:${name} 情况二:$!{name} 情况三:!${name} 那么三者之间到底有什么区别呢?莫慌!!!哈哈 情况一:${nam ...
- 编写自己的composer项目
编写自己的composer项目 composer的出现给php开发带来极大的便利, 配合phpunit的测试工具, 也可以更好的规范php开发. 尽管这些标准不是官方提供的, 但现在大部分的php ...
- zTree树形菜单使用实例
在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class=”ztree” 第二步:开启简单数据格式支持 第三步:编写树 ...
- APP-SERVICE-SDK:setStorageSync:fail;at page/near/pages/shops/shops page lifeCycleMethod onUnload function
APP-SERVICE-SDK:setStorageSync:fail;at page/near/pages/shops/shops page lifeCycleMethod onUnload fun ...
- python(Django之Logging、API认证)
一.Loging模块 用于方便的记录日志的模块 import logging logging.basicConfig(filename='log.log', format='%(asctime)s - ...