Python数据结构与算法
文章平均质量分 66
李元静
专注移动开发10年,对Android、鸿蒙、Python以及Flutter均有涉猎。最近更新Python爬虫与鸿蒙专栏,著有《Flutter App开发从入门到实战》一书,感兴趣的读者加微极客学编程,实时掌握博主的更新动态。
展开
-
Python数据结构与算法(20)---插值查找
目录插值查找插值查找公式计算实战:插值查找插值查找插值查找,又名Interpolation Search,是基于有序数列的元素查找,在采用二分查找算法的思想上进行了改进。其在最小值与最大值范围内,用公式确定中间分割比较点mid。这里,我们具体的插值公式如下所示:其时间复杂度为:O(loglogN)。插值查找公式计算假设,我们的数列还是[1,3,5,7,9,11,13],我们还是需要查找数值13。那么,根据上面的公式(left=0,right=6),我们计算得出mid=(13-1)*6/(13-原创 2021-09-27 18:04:28 · 1653 阅读 · 4 评论 -
Python数据结构与算法(19)---二分查找
目录二分查找图解二分查找实战:二分查找二分查找二分查找又名Binary Search,其采用折半的查找方式,实现对有序元素的快速查找。相信看到上面二分查找的定义,读者很容易就能想到,二分查找有一个非常重要的前提条件,那就是其需要已经排序好的数列。这样,我们折半查找可以缩小查找的次数,更加的高效。其具体原理:在数列中取中间下标值mid的元素e,进行查找元素key的比较。如果相等即查找成功,如果不等,大于就只需要在后半部分查找,小于需要在前半部分查找。不管是前半部分还是后半部分,我们在取其中间值mid原创 2021-09-13 18:12:46 · 1430 阅读 · 5 评论 -
Python数据结构与算法(18)---检索算法
目录检索算法线性查找图解线性查找实战:线性查找检索算法数据结构的排序算法,到17篇归并排序就彻底讲解完成。从今天开始,我们将进入全新的数据结构知识,它的名字叫查找算法,也叫检索算法。检索算法又分为排序检索与非排序检索。排序检索顾名思义就是先排序在进行查找,在数据库的查找中,我们往往都是这么做的。当然非排序检索也存在,只不过效率非常低。检索算法包括线性查找、二分查找、插值查找、斐波拉契查找、分块查找、哈希查找以及回溯查找7个算法。所以,从18到24篇都是检索算法的内容知识。下面,我们来介绍今天第1个原创 2021-09-10 18:18:31 · 1480 阅读 · 4 评论 -
Python数据结构与算法(17)---归并排序
目录归并排序图解归并排序实战:归并排序归并排序归并排序,又名Merge Sort,是建立在归并操作上的一种有效的排序算法。其具体原理有2个关键字:分与治。分:我们需要进行分的操作,将数列均衡的分成2部分(n//2),当然如果是奇数,可以自己决定将多余的数分到前半部分,还是后半部分。当分成2部分之后,在递归的对左右子序列继续2分,以此类推,直到只有1个元素,再也分不下去。治:所有元素分完之后,开始大小比较归并操作,从2个元素开始进行归并的比较,直到归并到n//2为止。其时间复杂度为:O(n log原创 2021-09-08 17:58:57 · 1307 阅读 · 6 评论 -
Python数据结构与算法(16)---快速排序
目录快速排序图解快速排序实战:快速排序快速排序快速排序,又称Quick Sort,其本身对冒牌排序进行了相应的改进。其基本原理:通过一轮排序将要排序的数据分割成独立的2个部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按照此放法对2部分数据分别进行快速排序,整个排序过程可以递归进行,直到整个数据变成有序序列。具体算法实施过程如下:首先,选取列表的最后一个元素最为基准数N,小于N的放前边,大于等于N的放后面。然后,接着再取前边的最后一个数为基准,同上放置。一直到每部分的下标相等,即原创 2021-09-06 18:32:57 · 1324 阅读 · 6 评论 -
Python数据结构与算法(15)---希尔排序
目录希尔排序图解写入排序实战:希尔排序希尔排序希尔排序,又称作Shell Sort,也叫缩小增量排序算法,是前文讲解的插入排序更高效的一种排序算法。其原理是:在n个元素的列表里,取增量n/2。数列开始值与增量值的尾值进行比较,小的放前面,大的放后面;把增量的前后都比较一遍,然后增量数-1。继续从头到尾进行比较,并调整大小;一直到增量等于1,就完成了所有列表元素的排序。至于增量规则可以自行定义。图解写入排序假设,又一个列表为[8,0,4,3,2,1]。具体原理步骤如下:第1次,增量为3,那么需要原创 2021-09-03 18:52:09 · 1860 阅读 · 11 评论 -
Python数据结构与算法(13)---选择排序
目录选择排序选择排序原理Python实现选择排序选择排序选择排序,英文称为Selection Sort,它是另外一种简单的排序算法。在数据集合中,通过一轮的新循环找到最小值,把它放到第一个位置,然后在剩余的数据中再找最小值,放到第二个位置,直到所有排序完成。选择排序原理假设,Python有一个n个元素的列表。那么实现步骤分为3步骤:外层开启0到n-1的循环每轮循环记住最小值的下标,循环完成后,将值放在最前面接着继续循环,标记最小值的下标,最后把最小值放到当前循环开始的位置,依次类推。直到n原创 2021-08-09 20:19:53 · 1298 阅读 · 9 评论 -
Python数据结构与算法(12)---冒泡排序
目录冒泡排序冒泡排序原理Python代码实现冒泡排序冒泡排序冒泡排序,其英文为Bubble Sort。是指把一组数据从左边开始依次进行两两交换,小的方前面,大的放后面,通过反复比较一直到没有数据需要交换为止。该排序方法由于很像水里的泡泡,从水底冒出的,故称之为冒泡排序。冒泡排序原理冒牌排序的原理如下:从列表开始,依次两两比较值的大小,把大的往后交换,一直到末尾,这样列表中最大的值肯定就是末尾的值。接着,在从列表开始,两两比较知道交换到倒数第二位,那么第二大的值确定。依次循环到只剩1,完成所原创 2021-08-06 18:20:55 · 2001 阅读 · 10 评论 -
为什么程序员用笛卡尔心形曲线告白的人,都还是单身?
目录笛卡尔的感人故事残忍的真相画出爱心线笛卡尔的感人故事1649年,法国数学家笛卡尔在欧洲爆发黑死病的时候,流浪到了瑞典,在瑞典斯德哥尔摩的街头邂逅了18岁的公主克里斯丁。这个时候,他意外的收到通知,瑞典国王聘请笛卡尔做了小公主的数学老师。小公主的数学在笛卡尔的帮助下突飞猛进,每天形影不离便产生了爱慕之情。但是不久之后,国王得知两人相爱后便大怒,于是下令将笛卡尔处死,幸得小公主苦苦相求,国王才没有杀死笛卡尔,而将其流放,而公主也被国王软禁了起来。在笛卡尔流放到法国之后,笛卡尔于是决定天天给公主写信原创 2021-08-04 19:21:15 · 1852 阅读 · 7 评论 -
Python数据结构与算法(11)---对象的非永久引用weakref
目录对象的非永久引用weakref引用引用回调最终化对象代理缓存对象对象的非永久引用weakrefweakref库支持对象的弱引用。正常的引用会增加对象的引用数,并避免它被垃圾回收。但结果并不总是期望的那样。比如,有时候可能会出现一个循环引用,或者有时候需要内存时,可能要删除对象的缓存。而弱引用是一个不能避免对象被自动清理的对象句柄。引用下面,我们来看一个简单的例子,示例如下:import weakrefclass MyObject: def __del__(self):原创 2021-06-17 18:33:51 · 1265 阅读 · 8 评论 -
Python数据结构与算法专栏目录
Python数据结构与算法专栏目录Python数据结构与算法(1)—枚举类型enumPython数据结构与算法(2)—字典序列ChainMapPython数据结构与算法(3)—统计可散列的对象CounterPython数据结构与算法(4)—双端队列dequePython数据结构与算法(5)—namedtuplePython数据结构与算法(6)—OrderedDictPython数据结构与算法(7)—数组arrayPython数据结构与算法(8)—维护有序列表bisectPython数据结原创 2021-05-28 13:19:44 · 1113 阅读 · 1 评论 -
Python数据结构与算法(9)---优先级队列queue
目录前言基本用法LIFO队列优先队列前言queue库提供了一个适用于多线程编程的先进先出(FIFO)数据结构,可以用来在生产者与消费者线程之间安全地传递消息或其他数据。它会为调用者处理锁定,使多个线程可以安全而更容易地处理同一个Queue实例。Queue的大小可能受限,以限制内存使用或处理。基本用法Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一段,使用get()从另一端删除。具体代码如下所示:import queueq = queue.Queue()fo原创 2021-05-25 19:49:46 · 2020 阅读 · 14 评论 -
Python数据结构与算法(8)---维护有序列表bisect
目录前言有序插入重复值处理前言bisect实现了一个算法来向列表中插入元素,同时仍保持列表有序。本篇,将详细介绍bisect库高效率的玩转列表。有序插入首先,我们来看看bisect库是如何实现列表的拆入的。具体代码如下所示:import bisecta = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5]print(a)new_a = []for i in a: position = bisect.bisect(new_a, i) bisect.ins原创 2021-05-24 19:28:28 · 2023 阅读 · 3 评论 -
Python数据结构与算法(7)---数组array
目录前言初识数组array基本用法前言一般来说,我们将Python中的list列表当作数组。但是Python中真正的数组是:array。它看上去跟list很相似,但是list列表成员可以是任意类型的组合也可以是单一的类型组合,而array数组并不能是,它的所有成员必须是相同的类型。包括了所有的数值类型或其他固定大小的基本类型。支持的类型如下表:代码类型最小大小(字节)bInt1BInt1hSigned short2HUnsigned short原创 2021-05-23 18:04:36 · 2547 阅读 · 7 评论 -
Python数据结构与算法(6)---OrderedDict
目录前言初始OrderedDict相等性move_to_end()前言既然上一篇博文学习了namedtuple转换为OrderedDict。那么本篇博文就直接讲解OrderedDict数据结构的用法。初始OrderedDictOrderedDict顾名思义也是一个字典,不过它是字典的子类。相对于普通的字典,它可以记住其内容增加的顺序。我们来看看普通字典的创建于OrderedDict字典的创建方式对比:import collectionsprint("普通Dict:")a = {}a['a'原创 2021-05-16 18:00:54 · 2824 阅读 · 2 评论 -
Python数据结构与算法(5)---namedtuple
目录前言初识namedtuple前言在Python中,我们使用元组往往是直接按其索引进行操作的。比如一个c元组(1,2,3),那么获取2值c[1]。对于简单的数据而言,这种操作没有什么问题。但数据结构的重点,就是在实际的需求多样化中,找到最符合的数据结构进行数据的操作变更。而当元组tuple有大量数据时,记住各个值对应哪个索引,显然是不可能的。而namedtuple除了为各个成员指定数值索引外,还为其指定了名字。本篇,将详细介绍namedtuple的使用方式以及优点。初识namedtuple与常原创 2021-05-14 18:19:15 · 3026 阅读 · 3 评论 -
Python数据结构与算法(4)---双端队列deque
目录前言前言原创 2021-05-11 18:53:09 · 3545 阅读 · 1 评论 -
Python数据结构与算法(3)---统计可散列的对象Counter
目录前言初始化Counter遍历Counterelements()most_common算数操作前言Counter是一个容器,可以跟踪等效值增加的次数。这个类可以用来实现其他语言中常用包或多集合数据结构实现的算法。本篇,将详细介绍容器Counter的使用方式。初始化CounterCounter支持3种形式的初始化,比如提供一个数组,一个字典,或单独键值对“=”式赋值。具体初始化的代码如下所示:import collectionsa = collections.Counter(['a', 'a原创 2021-05-09 20:22:19 · 3819 阅读 · 0 评论 -
Python数据结构与算法(2)---字典序列ChainMap
目录前言ChainMap重排列更新值前言容器数据类型包括数组list,字典dict以及元组tuple等。本篇,将详细介绍ChainMap字典序列的使用。ChainMapChainMap类管理的是一个字典序列,并按其出现的顺序搜索以查找与键关联的值。ChainMap提供了一个很好的“上下文”容器,因此可以把它看成一个栈,栈增长时发生变更,栈收缩时这些变更被丢弃。下面,我们来看看其基本的使用规则:import collectionsa = {"a": "A", "c": "c", }b = {原创 2021-05-07 18:02:32 · 3989 阅读 · 4 评论 -
Python数据结构与算法(1)---枚举类型enum
目录前言创建枚举迭代枚举比较枚举enum.IntEnum唯一枚举值代码中创建枚举前言之所以博主思考再三,开设一个数据结构的基础冷门课程。是因为目前大多数数据结构的书籍都使用的是C/C++,无疑增加了学习的门槛。而python语言相对来说,更容易入门掌握,通过python学习数据结构与算法,对于初学者似乎更加的友好。本篇,首先介绍的是枚举类型。在python库中,提供了枚举模块enum。通过该模块,我们可以定义程序员容易理解的字面量整数与字符串。创建枚举话不多说,我们先来创建一个简单的枚举类:星期原创 2021-05-05 19:17:31 · 4829 阅读 · 2 评论