
python数据结构与算法
文章平均质量分 76
辉辉咯
技术才是硬实力
展开
-
二分法查找一个有序的二维矩阵
如何在以下有序二维矩阵中查找一个数:alist = [ [1, 2, 3, 5, 8, 10], [11, 16, 19, 84, 98, 100], [111, 123, 148, 589, 857, 908], [2222, 4898, 7587, 8787, 9898, 9999] ]方法一:把二维矩阵分解成一维的二分法查找,就是进行m次的二...原创 2020-04-24 20:13:31 · 624 阅读 · 0 评论 -
python实现可以相加的类对象
在python中大部分数据类型都可以相加,比如:字符串,列表,元组,整型等等。那么我们自己实现的类,怎么使其能够相加?字符串,列表,元组等等也是一个对象,在python中一切皆对象嘛,之所以这些对象支持相加,是因为其内部实现了__add__这个魔法方法。可以查看这些对象的源码,发现都有实现了__add__方法: def __add__(self, *args, **kwargs...原创 2020-02-09 17:17:42 · 5353 阅读 · 1 评论 -
用heapq模块实现按优先级排序的优先级队列
需求:实现一个按优先级排序的队列,能够push和pop数据 在队列上每次pop都是返回优先级最高的元素 如果优先级相同,按它们最初被加入时的顺序返回 如果优先级发生改变,你该如何将其移至新的位置?使用标准库heapq来一步步的实现。heapq模块提供了堆排序算法的实现。注意这里指的是堆排序算法的实现而不是一个数据结构。有关heapq模块的详细介绍可以查看官方文档https://...原创 2020-02-07 18:12:44 · 910 阅读 · 0 评论 -
常见排序算法效率比较
常见排序算法效率比较至少掌握3种或者以上,快速排序广泛应用,所以快速排序必须得掌握,稳定性的重要性视应用场景而定。原创 2018-05-07 10:23:47 · 287 阅读 · 0 评论 -
python实现二分法查找
搜索搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找二分法查找二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查...原创 2018-05-07 11:56:20 · 2288 阅读 · 0 评论 -
python实现二叉树的创建和二叉树的遍历
二叉树的节点表示以及树的创建通过使用Node类中定义三个属性,分别为elem本身的值,还有lchild左孩子和rchild右孩子class Node(object): '''树节点''' def __init__(self, item): self.elem = item self.lchild = None self.rchild ...原创 2018-05-07 18:10:10 · 1025 阅读 · 0 评论 -
python实现冒泡排序
冒泡排序冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。对每一对相邻元素作同样...原创 2018-05-07 19:48:52 · 213 阅读 · 0 评论 -
python实现选择排序
选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移...原创 2018-05-07 19:51:22 · 162 阅读 · 0 评论 -
python实现插入排序
插入排序插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。插入排序分析实现'''i = 1 , [1] 依次从后向前比较, alist[1]与alist[0]比较i = 2 , [...原创 2018-05-07 19:53:56 · 183 阅读 · 0 评论 -
scrapy中meta的一个坑点
scrapy的meta的作用就是在执行scrapy.Request()函数时把一些回掉函数中需要的数据传进去,meta必须是一个字典,在下一个函数中可以使用response.meta防问,这里需要注意的是,meta传递的数据是浅拷贝传递的,如果传递的数据是可变的数据类型,那么很容易造成数据不对应的错误,以下是本人在工作中的遇到此问题的代码片段: def parse_jinyan(sel...原创 2018-10-17 21:08:00 · 4284 阅读 · 1 评论 -
python实现归并排序
归并排序归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。归并排序的分析实现def MergeSort(alist): '''归并排序''' n = le...原创 2018-05-07 10:18:57 · 208 阅读 · 0 评论 -
python实现快速排序
快速排序快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。步骤为:从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列...原创 2018-05-06 21:47:13 · 3185 阅读 · 0 评论 -
python实现希尔排序
希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序过程希尔排序的基本思想是:将数组列...原创 2018-05-05 14:16:23 · 128 阅读 · 0 评论 -
Python内置类型程序性能分析
timeit模块timeit模块可以用来测试一小段Python代码的执行速度。class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)Timer是测量小段代码执行速度的类。stmt参数是要测试的代码语句(statment);setup参数是运行代码时需要的设置;timer参数是一个定时器函数,与平台有关。...原创 2018-05-04 18:41:39 · 140 阅读 · 0 评论 -
Python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。list的基本实现技术Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:基于下标(位置)的高...原创 2018-05-04 21:02:30 · 719 阅读 · 0 评论 -
python实现单向链表
单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。表元素域elem用来存放具体的数据。链接域next用来存放下一个节点的位置(python中的标识)变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。# 节点, 包括:元素和下一个节点的地址clas...原创 2018-05-04 21:18:15 · 290 阅读 · 0 评论 -
python实现单向循环链表
单向循环链表单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。操作is_empty() 判断链表是否为空length() 返回链表的长度travel() 遍历add(item) 在头部添加一个节点append(item) 在尾部添加一个节点insert(pos, item) 在指定位置pos添加节点remove(item) 删除一个节点search...原创 2018-05-04 21:30:01 · 1184 阅读 · 0 评论 -
python实现双向链表
双向链表一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。操作is_empty() 链表是否为空length() 链表长度travel() 遍历链表add(item) 链表头部添加append(item) 链表尾部添加insert(pos, item) 指定位置添加re...原创 2018-05-04 21:35:17 · 516 阅读 · 0 评论 -
python实现栈结构
栈结构实现栈可以用顺序表实现,也可以用链表实现。栈的操作Stack() 创建一个新的空栈push(item) 添加一个新的元素item到栈顶pop() 弹出栈顶元素peek() 返回栈顶元素is_empty() 判断栈是否为空size() 返回栈的元素个数class Stack(object): '''栈,用顺序表实现''' def __init__(self): ...原创 2018-05-04 21:37:42 · 496 阅读 · 0 评论 -
python实现队列
队列的实现同栈一样,队列也可以用顺序表或者链表实现。操作Queue() 创建一个空的队列enqueue(item) 往队列中添加一个item元素dequeue() 从队列头部删除一个元素is_empty() 判断一个队列是否为空size() 返回队列的大小class Queue(object): '''队列,先进先出''' def __init__(self): s...原创 2018-05-04 21:39:22 · 290 阅读 · 0 评论 -
python双端队列的实现
双端队列双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。操作Deque() 创建一个空的双端队列add_front(item) 从队头加入一个item元素add_rear(item) 从队尾加入一个item元素remove_front() ...原创 2018-05-05 10:12:14 · 850 阅读 · 0 评论 -
算法概念与特性、算法效率衡量
算法的概念算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。算法是独立存在的一种解决问题的方法和思想。对于算法而言,实现的语言并不重要,重要的是思想。算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等),我们现在...原创 2018-05-04 18:36:48 · 532 阅读 · 0 评论