数据结构与算法
文章平均质量分 58
结合代码,通过实战介绍数据结构和算法,深入了解算法原理,掌握数据结构精髓。
Marvin Ming
目前在国企研究院做软件研发项目,擅长Python,爬虫、数据分析、软件开发和后端均有涉猎。
关于博客文章有任何问题请留言,我会不定期回复,欢迎交流,但百度10分钟内能够解决的问题不会回复。
其他问题可通过邮箱联系:constmmq@163.com。
展开
-
算法:NP问题,NP完全问题(NPC),NPhard问题
在做计算机算法关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,在网上查阅各种资料,花了很多时间来弄懂这块的内容。发现书上的概念太正式,定义太标准,不容易很快理解,而网上的资料有些地方论述的不够全面,像我这样的新手在遇到NP家族的概念和问题的时候就很容易懵逼…因此在此将我的心得与整理的资料放在这里,一方面供我以后自己参考,避免又搞混,一方面和大家进行交流。原创 2016-12-14 22:51:03 · 22472 阅读 · 4 评论 -
排序算法(七)——快速排序算法详解及Python实现
一、简介快速排序算法最早是由图灵奖获得者Tony Hoare设计的,被列为20世纪十大算法之一。属于交换排序类,是冒泡排序算法的升级,是一种不稳定排序算法,其时间复杂度为O(nlogn)。二、算法介绍快速排序算法的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的。选取数组中第一个元素作为pivot key(枢轴),即令pv = li[low],然后从数组的两端向中间扫描;当low &l原创 2021-08-05 22:52:39 · 791 阅读 · 1 评论 -
排序算法(六)——归并排序算法详解及Python实现
一、简介归并排序(Merging Sort)算法是一种稳定排序算法,和堆排序算法一样,都是利用完全二叉树的深度是⌊logn⌋\lfloor logn\rfloor⌊logn⌋+1 的特性,来提高排序效率,其时间复杂度和堆排序相同,均为O(nlogn)。二、算法介绍归并排序就是利用归并(将两个或以上的有序表组合成一个新的有序表)的思想实现的排序方法。基本原理是:假设初设序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1, 然后两两归并,得到⌈n/2⌉\lceil n/2 \rceil⌈原创 2021-08-04 11:18:03 · 825 阅读 · 6 评论 -
排序算法(五)——堆排序算法详解及Python实现
本文目录一、简介二、算法介绍三、代码实现排序算法系列——相关文章一、简介堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn)。堆排序由Floyd和Williams在1964年共同发明,是对简单选择排序算法的优化,其出发点是:简单选择排序在遍历时,在待排序的n个元素中,需进行n-1次比较,才能选择出最小的元素,但没有将每次遍历时比较的结果保存下来,导致后续遍历时仍需进行重复操作,因此导致元素比较次数较多。堆排序就是通过堆这种结构,实现了在选择出最小元素的同时,保存了原创 2021-08-04 07:47:57 · 2086 阅读 · 6 评论 -
排序算法(四)——希尔排序算法详解及Python实现
一、简介希尔排序(Shell Sort)算法,属于插入排序类,是不稳定排序,是对直接插入排序算法的优化,其时间复杂度为O(n3/2)。希尔排序是D.L.Shell 于1959年提出来的算法,在此之前排序算法的时间复杂度基本上都是O(n2)的,希尔排序是突破这个时间复杂度的第一批算法之一。[1]二、算法介绍直接插入排序算法在1-数组基本有序或2-数组元素较少时效率很高,希尔排序的出发点就是如何对待排序数组进行调整,使其满足上述两个条件,从而利用直接插入排序算法的优势。最终,科学家Shell通过对数原创 2021-08-03 10:39:47 · 663 阅读 · 2 评论 -
排序算法(三)——直接插入排序算法详解及Python实现
一、简介直接插入排序算法是一种稳定排序算法,其每次循环将特定值插入前面排序好的数组部分,时间复杂度为O(n2),性能好于冒泡排序和选择排序。二、算法介绍算法步骤:遍历数组,令i从0到n-2,若当前元素li[i]大于后一元素li[i+1],则移动元素;移动方式为:将li[i+1]赋值给t,令j=i+1,然后从位置i向前遍历,若li[j-1] > t,则将位置j-1的元素向后移动,即li[j] = li[j-1],直至li[j-1] >= t,然后将元素li[j+1]插入至位置j处。此处原创 2021-08-02 17:28:20 · 809 阅读 · 0 评论 -
排序算法(二)——简单选择排序详解及Python实现
一、简介选择排序算法是一种不稳定排序算法(见参考资料2中的讨论),时间复杂度为O(n^2^),但由于交换次数较少,性能略优于冒泡排序。基本思想是在第i次遍历时,在第i+1至第n个元素中,选出最小的元素作为有序序列的第i个元素。二、算法介绍以下面的数组为例,对其使用选择排序法进行升序排序:901050803070406020mi用于记录每次遍历时最小元素的位置,开始遍历时令mi=i,若li[j] < li[mi],则令mi=j。i=0时:j从1处开始遍历,得出mi=1,数组li变为:1原创 2021-08-02 15:52:31 · 419 阅读 · 0 评论 -
排序算法(一)——冒泡排序算法详解及Python实现
一、简介冒泡排序算法是众多排序算法中思路最简单、最容易理解的一个。直观理解就是将数组中较小(或较大)的值不断上浮,最终形成有序数组,这个过程类似于气泡从水底不断冒出来的过程,因此称为冒泡排序。冒泡排序属于交换排序类,是一种稳定排序算法,其时间复杂度为O(n2)。二、算法介绍以下面的数组为例,对其使用冒泡法进行升序排序:901050803070406020遍历数组,比较相邻两个元素,若前一元素大于后一元素,则交换两个元素位置;每次遍历后,都会不断将最大、次大…的元素放置在数组末尾,循环n(数组原创 2021-08-02 15:17:12 · 548 阅读 · 0 评论 -
Python实现KMP算法-字符串匹配和查找
《大话数据结构》一书第五章介绍了字符串的定义、存储结构和模式匹配算法。关于模式匹配,重点介绍了暴力(Brute-Force)算法和KMP算法,暴力算法较为简单,但性能较低。KMP算法在暴力算法基础上,通过特别巧妙的方式,降低了字符串比较次数,将时间复杂度从O((n-m+1)*m)降低到了O(n+m)。但是!!!这本书中关于KMP算法的介绍冗长、混乱,讲解的不够透彻,只讲其一,不讲其二,非常不便于理解。在反复阅读和理解消化了几个小时后,发现对KMP算法还是不能了然于胸。因此在网上查阅了相关资料,个人感觉讲原创 2021-07-24 11:43:40 · 450 阅读 · 4 评论 -
Python基于链表结构实现链队列Queue
上一篇文章介绍了循环队列的顺序存储结构的实现,Python基于顺序结构实现循环队列Queue。本文参考《大话数据结构》4.13一节,基于链表结构实现了链队列。对于循环队列与链队列的比较,《大话数据结构》中有很好的介绍:对于循环队列与链队列的比较,可以从两方面来考虑:从时间上,其实它们的基本操作都是常数时间,即都为O(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异。对于空间上来说,循环队列必须有一原创 2021-07-18 11:41:58 · 438 阅读 · 0 评论 -
Python基于顺序结构实现循环队列Queue
参考《大话数据结构》4.12一节,基于顺序结构实现了循环队列。class SeqQueue(object): def __init__(self, size=10): self.MAXSIZE = size self.data = [' '] * size self.front = 0 # 头指针 self.rear = 0 # 尾指针 def __len__(self): return (self.re原创 2021-07-18 10:01:11 · 648 阅读 · 0 评论 -
Python下基于栈和逆波兰算法实现四则运算
参考《大话数据结构》一书4.9节,Python下基于栈和逆波兰算法实现四则运算。栈的实现使用顺序结构,即基于列表实现,参考本人博客Python实现顺序结构栈Sequence Stack中缀转换后缀采用逆波兰算法,参考本人博客Python利用栈将中缀表达式转换为后缀表达式(四则运算)。计算代码如下所示(transform函数见上述 2.Python利用栈将中缀表达式转换为后缀表达式(四则运算)):def arithmetic(expression): signs = '+-*/'原创 2021-07-17 22:51:26 · 422 阅读 · 0 评论 -
Python利用栈将中缀表达式转换为后缀表达式(四则运算)
参照《大话数据结构》一书4.9节,基于Python实现了中缀表达式到后缀表达式的转换。栈的实现使用顺序结构,即基于列表实现,与本人博客Python实现顺序结构栈Sequence Stack一致。class SeqStack(object): def __init__(self, size=10): self.__MAXSIZE = size # 将MAXSIZE定义为私有变量,禁止子类对象访问 self.__data = [' '] * size # 将dat原创 2021-07-17 21:36:19 · 807 阅读 · 0 评论 -
Python使用循环和递归实现斐波那契数列
基于Python实现斐波那契数列。方法一:使用循环,通过yield生成器返回结果,使用时通过list转换为列表。这种方法效率更高,占用空间较小;方法二:使用递归实现,效率很低,占用内存较高。n=40时,方法一耗时不足1s,方法二耗时68s。import timedef fib(n): a = 0 b = 1 for i in range(n): yield b a, b = b, a + bdef fib_recursive(n):原创 2021-07-17 19:30:41 · 2287 阅读 · 0 评论 -
Python实现链栈 Link Stack
"""Python实现链栈by 勤奋的清风 at 2021-07-17"""class Node(object): def __init__(self, value=None, next_node=None): self.value = value self.next = next_node def set_value(self, value): self.value = value def set_next(self,原创 2021-07-17 18:31:50 · 619 阅读 · 0 评论 -
Python实现顺序结构栈Sequence Stack
参考大话数据结构,利用Python3实现了栈的顺序结构。class SeqStack(object): def __init__(self, size=10, elem_type=int): self.__MAXSIZE = size # 将MAXSIZE定义为私有变量,禁止子类对象访问 self.type = elem_type self.__data = [elem_type] * size # 将data定义为私有变量,禁止子类对象访问原创 2021-07-17 13:04:28 · 304 阅读 · 0 评论