Python—数据结构和算法
python数据结构和算法
我是小杨我就这样
当一个代码的工匠回首往事,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样当他老去的时候,可以很自豪地告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅
公众号《小杨的技术人生》
展开
-
Python数据结构与算法——线性结构总结
文章目录线性结构总结栈 Stack队列 queue双端队列 dequeue链表线性结构总结栈、队列、双端队列、链表以及其应用文章收录于公众号:<小杨的python之路>Github:Python数据结构与算法栈 Stack栈stack维持了数据项后进先出LIFO的次序书写表达式的方法有前缀prefix,中缀infix,后缀postfix,由于栈具有次序反转的特性,所以栈结构适合用于开发表达式求值和转换算法数据结构之线性结构——栈(StackPython数据结构与原创 2020-06-26 10:50:37 · 804 阅读 · 0 评论 -
【算法图解】——集合覆盖问题
文章目录集合覆盖问题州集合,电台字典电台选择集合覆盖问题覆盖问题要求不会重复——采用set()假设你要办一个广播电台,要让所有的8个州都听到,你要选择广播电台,如何选择尽可能少的广播电台州集合,电台字典# 包含所有州的集合states_needed = set(['mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az']) # 州不会出现重...原创 2020-02-26 12:22:16 · 3206 阅读 · 1 评论 -
【算法图解】——狄克斯特拉算法
文章目录狄克斯特拉算法实现算法节点实时计算消耗的权重存储父节点记录遍历过的节点找到最小权重的节点狄克斯特拉算法狄克斯特拉算法加权图——提高/降低某些边的权重加权图:“边”上有了权重(例如:时间)狄克斯特拉算法:找到总权重最小的路径计算非加权图的最短路径——广度优先算法计算加权图的最小权重——狄克斯特拉算法**注意:**当图中存在负权重时,无法使用狄克斯特拉算法实现算法节...原创 2020-02-24 14:42:59 · 876 阅读 · 0 评论 -
【算法图解】——图、广度优先搜索并实现搜索
文章目录图无向图和有向图广度优先算法问题解决步骤实现图实现广度优先搜索图节点(node)和边(edge)代表着一种连接关系解决的问题:最短路径,象棋中将对方将死最少步数无向图和有向图无向图互为邻居广度优先算法通过图的连接关系,一步一步搜索问题解决步骤使用图建立问题模型使用广度优先算法解决问题实现图利用字典实现图注意:peggy是alice的邻居,但alice...原创 2020-02-22 20:42:38 · 546 阅读 · 0 评论 -
【算法图解】——散列表
文章目录散列表散列表无论你给他什么数据,他都还你一个数字——“将输入映射到数字”即不需要搜素,直接是映射的关系,时间复杂度O(1)数组与链表被直接映射到内存上,但散列表更复杂,它使用散列表函数来确定元素位置其实说了半天,散列表在python对应的就是字典...原创 2020-02-22 20:19:30 · 412 阅读 · 0 评论 -
【算法图解】——网页缓存
"""网页缓存"""cache = {} # 缓存def get_page(url): if cache.get(url): # 如果网页在缓存中 return cache[url] else: data = get_data_from_serve(url) # 从服务器获取网页 cache[url] = data # 先将数据...原创 2020-02-22 18:42:20 · 206 阅读 · 0 评论 -
【算法图解】——实现每次打印输出暂停1秒
from time import sleepdef print_item2(alist): for item in alist: sleep(1) # 暂停1秒 print(item) print_item2([2, 5, 6, 9, 8, 7])2<1秒>5<1秒>6<1秒>9&l...原创 2020-02-20 16:56:58 · 342 阅读 · 0 评论 -
【算法图解】——快速排序改进
文章目录快速排序思路注意!!!!!错误代码正确代码代码优化快速排序思路如果列表为空或者只有一个元素则不用排序选择首元素为基准值创建两个列表:小于基准值的less=[ ]和大于基准值的high=[ ]遍历整个列表,小于基准值的放入less,大于基准值的放入high注意!!!!!列表循环的时候会出现和基准值相等的元素,放在哪边都可以,但是注意不要将基准值再遍历,这样就会导致每一次l...原创 2020-02-20 16:40:43 · 237 阅读 · 0 评论 -
算法图解——递归
递归函数自己调用自己在用递归的同时,也可以用while循环实现递归只是让解决方案更加清晰,并没有性能上的优势,有时候甚至循环的性能更好“如果使用循环,程序性能可能更高;如果使用递归,程序可能更容易理解”基线条件和递归条件编写递归函数时,必须告诉他停止的条件基线条件:函数不再调用自己即停止递归条件:调用自己def countdown(i): print(i, end...原创 2020-02-17 17:07:27 · 198 阅读 · 0 评论 -
【算法图解】——二分查找,选择排序
文章目录二分查找1. 小结选择排序1. 内存工作原理2. 链表3. 数组4. 选择排序5. 小结二分查找二分查找的时间复杂度:O(logn),log都是以2为底简单查找法:O(n),线性时间算法的速度指的不是时间而是操作数的增长,即要进行多少步操作"""算法图解——二分查找"""def binary_search(alist, item): low = 0 high...原创 2020-02-14 13:39:34 · 281 阅读 · 0 评论 -
二叉树的遍历
文章目录二叉树的遍历深度优先遍历先序遍历中序遍历后序遍历二叉树的遍历深度优先遍历:一般用于递归广度优先遍历:一般用于队列二叉树的实现主要涉及pop(0) 函数,删除并返回值深度优先遍历先序遍历:根节点——左子树——右子树中序遍历:左子树——根节点——右子树后序遍历:左子树——右子树——根节点先序遍历"""先序遍历"""def preorder(self, root):...原创 2020-02-12 18:05:27 · 93 阅读 · 0 评论 -
二叉树的节点表示以及树的创建
文章目录二叉树的节点表示树的创建二叉树的节点表示class Node(object): """节点类""" # elem为本身的值,lchild为左孩子,rchild为有孩子 def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchil...原创 2020-02-12 17:31:27 · 301 阅读 · 0 评论 -
二分法查找(折半查找)
文章目录二分法查找非递归实现递归实现二分法查找优点:比较次数少,速度快,平均性能好缺点:必须为有序列表,插入删除困难适用于不经常变动,而查找频繁的有序列表非递归实现def binary_search(alist, item): first = 0 last = len(alist)-1 while first <= last: midp...原创 2020-02-12 10:14:09 · 226 阅读 · 0 评论 -
归并排序
文章目录归并排序原理时间复杂度归并排序线递归分解数组,再合并数组原理将数组分解最小之后,然后合并两个有序数组,先比较两个数组最前面的数,然后指针后移,再比较排序时间复杂度最优时间复杂度=最坏时间复杂度=O(nlogn)稳定性:稳定"""归并排序"""def merge_sort(alist): if (len(alist)) <= 1: retu...原创 2020-02-11 16:43:58 · 139 阅读 · 0 评论 -
希尔排序——python3.7中为双斜杠“//”
文章目录希尔排序(缩小增量排序)希尔排序(缩小增量排序)插入排序的一种,非稳定非序算法希尔排序是将记录按下标的一定增量分组,对每组使用直接插入排序算法排序def shell_sort(alist): n = len(alist) # 初始步长 gap = n // 2 while gap > 0: # 按照步长进行插入排序...原创 2020-02-11 16:17:31 · 312 阅读 · 0 评论 -
快速排序
文章目录快速排序步骤时间复杂度划重点代码快速排序通过一次排序将数据分成独立的两个分区,一部分所有数据都小于基准数据,一部分都大于基准数据步骤从数列中选出一个基准数据小于基准的放到基准前面大于基准的放到基准后面相等于基准的两边都行两个分区分别再快速排序时间复杂度最优时间复杂度:O(nlogn)最坏时间复杂度:O(n^2)稳定性:不稳定划重点通常以首元素为基准循环的...原创 2020-02-09 19:28:01 · 92 阅读 · 0 评论 -
插入排序
文章目录插入排序时间复杂度插入排序**原理:**通过构建有序序列,对于未排序数据,在已排序序列中从后往前扫描,找到相应的位置。扫描过程中需要将有序序列的元素不断向后移动时间复杂度最优时间复杂度:O(n)最坏时间复杂度:O(n^2)稳定性:稳定def insert_sort(list): # 从第二个元素,下标为1的元素开始向前插入 for i in range(1...原创 2020-02-09 10:18:02 · 104 阅读 · 0 评论 -
选择排序算法
文章目录选择排序算法选择排序的优点时间复杂度选择排序算法关键词:数据移动序列中找到最小元素放到第一个,生下的序列找到最小元素又放到第一个,直到结束选择排序的优点数据移动,若某个元素位于正确的最终位置上,则它就不会被移动,选择排序每一次交换一对元素,它们至少有一个将被移动到最终位置,n个元素将移动n-1次时间复杂度最优时间复杂度=最坏时间复杂度=O(n)稳定性:不稳定def sel...原创 2020-02-09 10:03:22 · 124 阅读 · 0 评论 -
冒泡排序法(bubble_sort)
文章目录冒泡排序法时间复杂度测试冒泡排序法名称来历: 越小的元素会经由交换慢慢“浮”到数列的顶部比较相邻的元素,交换对每一对相邻的元素作同样的工作,从第一队到结尾最后一对,结束之后,最大的元素会跑到最后面重复操作,除了最后一个元素,第二大元素会跑到倒数第二个位置持续对越来越少的元素操作,直到最小的元素到了最前面时间复杂度最优时间复杂度:O(n)最坏时间复杂度:O(n^2)...原创 2020-02-08 13:50:33 · 1078 阅读 · 0 评论 -
双端队列
文章目录双端队列双端队列的实现双端队列队列两端都可以实现入队和出队操作双端队列的实现依然采用items=[ ]列表实现insert(0, item)实现头入队append()实现另一端入队pop(0)实现头出队pop()实现另一端出队class Deque(object): """双端队列""" def __init__(self): sel...原创 2020-02-08 10:54:18 · 182 阅读 · 0 评论 -
队列的实现
文章目录队列(queue)队列的实现测试一下代码:队列(queue)只允许在一端插入元素(队尾),另一端删除元素(队头)队列不允许在中间操作数据队列的实现队列的实现也可以采用顺序表或者链表采用items=[ ],列表的形式通过**insert()**插入数据(入队)通过**pop()**删除数据(出队)class Queue(object): """队列""" ...原创 2020-02-08 10:34:44 · 311 阅读 · 0 评论 -
python实现堆栈
主要利用列表[]利用append()实现入栈利用pop()实现出栈"""堆栈的实现"""class Stack(object): """栈""" def __init__(self): self.items = [] # 采用列表 def is_empty(self): """判断栈是否为空""" return ...原创 2020-02-07 20:13:30 · 486 阅读 · 0 评论 -
命令提示符(cmd)中pip升级失败
尝试使用管理员身份打开cmd原创 2020-02-07 09:16:35 · 1333 阅读 · 0 评论 -
单链表的实现
•is_empty() 链表是否为空•length() 链表长度•travel() 遍历整个链表•add(item) 链表头部添加元素•append(item) 链表尾部添加元素•insert(pos, item) 指定位置添加元素•remove(item) 删除节点•search(item) 查找节点是否存在class SingleNode(object): """节点"...原创 2020-02-05 19:19:16 · 109 阅读 · 0 评论 -
Python内置模块timeit——测试一小段Python代码的执行速度
timeit,Timer(stmt=‘pass’, setup=‘pass’, time=)timeit.Timer.timeit(number=1000000)Timer:测量小段代码执行速度的类stmt:参数是要测试的代码语句(statment)setup:参数是运行代码时需要的设置timer:定时器函数"""列表的操作"""def test1(): l = [] ...原创 2020-02-04 16:21:23 · 531 阅读 · 0 评论 -
初学算法——如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
题目:如果 a+b+c=1000,且 a2+b2=c**2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?第一次尝试:import timestart_time = time.time()# 三重循环嵌套for a in range(1001): for b in range(1001): for c in range(1001): ...原创 2020-02-04 09:38:23 · 2509 阅读 · 1 评论