Python 笔记(常见算法)
人类告诉计算机以什么样的顺序去执行某些动作,这就是我们通常所说的算法。修炼好算法这门内功,再结合编程语言这些招式,才能称霸编程武林。
Zhao.Mr
精通Shell编程;对Mysql、Oracle、Postgresql等数据库有着丰富的管理经验,注重于实战操作,喜欢研究新技术;熟悉Python全栈开发;了解Hadoop各种组件及其应用
展开
-
001.【算法概念】大O表示法
Python 算法实战原创 2022-08-25 12:49:55 · 127 阅读 · 0 评论 -
002.【查找算法】顺序查找算法
顺序查找算法原创 2022-09-02 13:35:43 · 604 阅读 · 0 评论 -
003.【查找算法】折半查找算法
折半查找算法又称为二分查找算法,折半查找算法是将数据分割成两等份,首先用键值(要查找的数据)与中间值进行比较。如果键值小于中间值,可确定要查找的键值在前半段;如果键值大于中间值,可确定要查找的键值在后半段。然后对前半段(后半段)进行分割,将其分成两等份,再对比键值。如此循环比较、分割,直到找到数据或者确定数据不存在为止。折半查找的缺点是只适用于已经初步排序好的数据列;优点是查找速度快,明显比顺序查找的次数少。原创 2022-09-02 14:26:42 · 422 阅读 · 0 评论 -
004.【查找算法】插补查找算法
插补查找算法又称为插值查找,它是折半查找算法的改进版。插补算法是按照数据的分布,。由此可以看出,插补查找算法比折半查找算法的取值范围更小,因此它的速度要比折半法查找快,这就是插补查找算法的优点。原创 2022-09-02 16:10:11 · 530 阅读 · 0 评论 -
005.【查找算法】哈希查找算法
哈希查找算法就是使用哈希函数来计算一个键值所对应的地址,进而建立哈希表格,然后利用哈希函数来查找到各个键值存放在表格中的地址。简单来说,就是把一些复杂的数据,通过某种函数映射(与数学中的映射关系一样)关系,映射成更易于查找的方式。,完美的哈希查找算法一般都可以做到一次读取完成查找。哈希查找算法就是这样一种算法,例如,在一本书中查找内容,首先翻开这本书的目录,然后在目录上找到想要的内容,最后根据对应的页码就能找到所需要的内容。哈希查找算法具有保密性高的特点,因此哈希查找算法常被应用在数据压缩和加解密方面。原创 2022-09-05 12:08:42 · 751 阅读 · 0 评论 -
006.【查找算法】分块查找算法
分块查找算法是二分法查找算法和顺序查找算法的改进方法,分块查找算法要求索引表是有顺序的,对块内的节点没有排序要求,块内结点可以是有序的也可以是无须的。分块查找算法就是把一个大的线性表分成若干块,每块中的结点可以任意存放,但块与块之间必须排序。与此同时,还要建立一个索引表,把每块中的最大值作为索引表的索引值,此索引表需要按块的顺序放到一个辅助数组中。查找时,首先在索引表中进行查找,确定要找的结点所在的块。由于索引表是排序的,因此,对索引表的查找可以采用顺序查找算法或二分法;原创 2022-09-05 14:33:15 · 1873 阅读 · 1 评论 -
007.【查找算法】斐波拉契查找算法
,mid = low + F(n)-1,已知 mid 为划分点(黄金分割点),将待查找表划分为左边、右边,即 F(n)个元素分割为前半部分F(n-1)-1个元素、后半部分F(n-2)-1个元素。整体来说,它是根据斐波拉契数列的特点对有序表进行分割,寻找比例分割点mid,并进行比较,取舍范围。原创 2022-09-05 17:38:28 · 406 阅读 · 0 评论 -
008.【查找算法】六种查找算法的时间复杂度
上述时间复杂度都是按照各个算法的平均(理想)复杂度进行计算的。情况的不同复杂度就会不同。时间复杂度(大O表示法)原创 2022-09-05 18:08:29 · 8944 阅读 · 0 评论 -
009.【散列表】散列概念
利用字典查找汉字的过程就是散列表的思想。散列表,又叫作哈希表,是通过给定的关键字直接访问到具体对应值的数据结构。简单的说,就是把关键字映射到一个表中的位置来直接访问记录,以加快访问速度。通常把关键字称为Key,把对应的记录称为Value,把存放记录的数组叫作散列表。原创 2022-09-06 15:58:59 · 490 阅读 · 0 评论 -
010.【排序算法】选择排序法
选择排序法就是反复从未排序的数列中取出最小(或最大)的数据,将其存放在序列的起始位置,然后,再从未排序的元素中继续寻找最小(或最大)的数据,存放在已排序序列的末尾,以此类推。最后的结果即为已经排序好的数列。选择排序法最后的结果有两种形式,即递增数列和递减数列。原创 2022-09-06 17:06:46 · 268 阅读 · 0 评论 -
011.【排序算法】冒泡排序法
冒泡排序法是观察水中气泡变化而创造的排序方法,它的基本原理是从第一个数开始,比较相邻数据的大小,如果大小有误,则对调之后再与下一个数据进行比较,就像气泡逐渐从水低上升到水面上的情况。经过不断的交换之后,就可以找到最后一个数据正确的位置。接着逐步进行交换,直到完成所有数据的排序为止。冒泡排序法也有两种形式,即递增数列和递减数列。原创 2022-09-06 17:34:13 · 533 阅读 · 0 评论 -
012.【排序算法】直接插入排序法
直接插入排序法是将数列中的数据,逐一与已排序好的数据进行比较。例如,在排好顺序的两个数据中插入第三个数据,就需要将其与排好的两个数据进行比较,通过比较结果将数据各自放在合适的位置。即在第三个数据插入数列时,这三个数据已然是排好顺序的。接着将第四个数据插入,以此类推,直到排序完成。直接插入排序法最后的结果也有两种形式,即递增数列和递减数列。原创 2023-06-18 13:35:25 · 71 阅读 · 0 评论 -
013.【排序算法】合并排序法
合并排序法是针对已经排序好的两个或两个以上的数列,通过合并的方式,将其组合成一个大的且排序好的数列。首先是将无序的数列分成若干小份,分若干份的规则就是不断把每段长度除以2(对半分),直到分到不能再分为止,然后对分好的数列进行排序,最后再逐步合并成一个排序好的大数列。合并排序法最后的结果也有两种形式,即递增数列和递减数列。原创 2023-06-18 13:34:15 · 150 阅读 · 0 评论 -
014.【排序算法】希尔排序法
希尔排序法是插入排序法的一种,是直接插入排序算法的更高级的改进版本。希尔排序法可以减少插入排序法中数据移动的次数,加快排序的进行,因此它被称为缩小增量排序。希尔排序法排序的原则是将原始数据分成特定间隔的几组数据,然后使用插入排序法对每组数据进行排序,排序之后,再减小间隔距离,然后重复插入排序法对每组数据排序,直到所有数据完成排序为止。希尔排序法最后的结果有两种形式,即递增数列和递减数列。原创 2023-06-18 13:36:33 · 83 阅读 · 0 评论 -
015.【排序算法】快速排序法
快速排序法又称为分割交换法,它是冒泡排序法的一种改进。它的基本思想是:先在数据中找一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中,小于中间值的数据放在左边,大于中间值的数据放在右边,再用同样的方式处理左、右两边的数据,直到排序完成。快速排序法最后的结果也有两种形式,即递增数列和递减数列。原创 2023-06-18 13:35:05 · 133 阅读 · 0 评论 -
016.【排序算法】堆排序法
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父结点。从这句话来看,堆有两个条件:(1)是一个完全二叉树(2)子结点的键值或索引总是小于(或者大于)它的父结点。原创 2023-06-18 13:35:37 · 71 阅读 · 0 评论 -
017.【排序算法】计数排序法
前边介绍的几种排序方法都是基于数据之间进行比较交换进行排序,计数排序和基数排序都是非交换的排序。计数排序的主要思想是将待排序数据值转化为键,存储在额外开辟的数组空间中。计数排序要求输入的数据必须是有确定范围的整数,因此计数排序法适用于量大范围小的数据,例如公司员工入职年限问题,公司员工年龄问题,高考排名问题等等。原创 2023-06-18 13:35:53 · 81 阅读 · 0 评论 -
018.【排序算法】基数排序法
基数排序法和计数排序法一样,都是一种非交换排序。基数排序过程和计数排序过程都需要借助桶来进行。基数排序的主要思想是设置若干个桶,将关键字为k的记录放入第k个桶,然后按序号将非空的数据连接。关键字k就是将每个数据按个位、十位、百位…进行分割而产生的。基数排序不仅仅可以应用在数字之间的排序,还可以应用在字符串排序(按26个字母顺序)等。原创 2023-06-18 13:38:04 · 48 阅读 · 0 评论 -
019.【排序算法】各种排序算法的比较
多学两招:辅助记忆法:冒泡、选择、直接排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O(n2)(一遍找元素O(n),一遍找位置O(n))。快速、合并、希尔基于二分思想,平均时间复杂度为O(nlog(n))(一遍找元素O(n),一遍找位置O(logn))。计数排序、基数排序是线性阶(O(n))排序。原创 2023-06-18 13:38:26 · 44 阅读 · 0 评论 -
020.【递归算法】
这种数据结构称为“栈”:它的结构是一个“后进先出”的压入弹出式的数据结构。将递归函数放入栈中,它会自动包含所有未完成的函数调用。使用栈结构,我们就不需要追踪每步的递归调用。注意:栈结构虽然方便,但是由于每个函数调用都需要用一定的内存,因此它需要占用很多的内存空间。如果栈使用的空间很大,就说明有很多函数需要调用,这时可以重新编写代码,将递归结构换成循环结构;例如,求n的阶乘(一个正整数的阶乘是所有小于或等于该数的正整数的积,并且0的阶乘为1),利用阶乘的规律计算n的阶乘。原创 2023-06-18 13:36:47 · 63 阅读 · 0 评论 -
021.【动态规划算法】
动态规划算法是将待解决的问题拆分成一系列相互交叠的子问题,它的基本思想与合并排序算法类似,也是将待求解的问题分解为若干个子问题(阶段)。动态规划算法需要按顺序求解子问题,前一子问题的解为后一子问题的求解提供了有用的信息。在求解任何一个子问题时,都要列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题后,那么最后一个子问题就是初始问题的解。简单来说,就是不要让程序做重复的事情。原创 2023-06-18 13:38:56 · 67 阅读 · 0 评论 -
022.【贪心算法】
贪心算法又称为贪婪算法。贪心算法是指在对问题求解时,总能作出在此时此刻认为是最好的选择。也就是说,不从整体最优上加以考虑,只作出在某种意义上的局部最优解。它与动态规划算法相类似在于,最优解问题大部分都可以拆分成一个一个的子问题。贪心算法与动态规划算法不同之处在于,动态规划算法是得出整个问题的最优解,每次的结果会对未来的结果产生影响。而贪心算法每次的结果不会对未来的结果产生影响,只是考虑眼前的问题。原创 2023-06-18 13:39:39 · 55 阅读 · 0 评论 -
023.【回溯算法】
回溯算法也叫试探法,它是一种系统地搜索问题而求解的方法。回溯算法可以找出所有解的一般性,同时可以避免不正确的数值。一旦发现不正确的数值,就不再继续下一层而是返回到上一层,以节省时间。简单来说,回溯算法就是遇到错误就退缩的一种算法。用通俗易懂的话描述就是:通过选择不同的岔路口寻找目的地,一个岔路口、一个岔路口地去尝试找到目的地。如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。原创 2023-06-18 13:38:03 · 107 阅读 · 0 评论 -
024.【链表算法】
例如,有“学生”这样一个链表,链表中需要包括学生的姓名、性别、学号等一些基本信息。创建这样的一个链表,链表里面包括多个学生的信息。可以看出,“学生一”的尾结点“next”指向了下一个“学生二”的头结点学号“02”,这就是链表的特性,即上一个信息的尾结点next会下一个信息的头结点的内存地址。由于每个结点都包含了可以链接起来的信息,所以用一个变量就能够访问整个结点序列。在上面讲解中出现了两个词:“指向”和“地址”,了解C语言的人可能会知道,这是典型的指针。没错,在C语言中,可以使用指针创建链表。原创 2023-06-18 13:38:23 · 243 阅读 · 0 评论 -
025.【树形结构算法】
二叉树依然是树形结构。但是二叉树还有一个条件:它的每个结点都有两个分支,左侧分支称为“左子树”;右侧分支称为“右子树”,因此二叉树的最大的度就是2。原创 2023-06-18 13:40:34 · 1095 阅读 · 0 评论 -
026.【图形结构算法】
树形结构用于描述节点和节点之间的层次关系,而图形结构用于描述两个顶点之间是否连通的关系。在计算机科学中,图形结构是最灵活的数据结构之一,很多问题都可以使用图来求解。无向图是每条边都没有方向的图,同一个边的两个顶点没有次序关系。例如,(V1,V2)和(V2,V1)表示的是相同的边。有向图是每条边都有方向的图,同一个边的两个顶点有次序关系。图中的每一条边都可以使用有序对来表示。是指从顶点V1指向顶点V2的一条边,V1表示尾部,而V2表示头部。原创 2023-06-18 13:38:59 · 178 阅读 · 0 评论 -
027.【其他算法】
分治算法也称分而治之算法,通过分治算法可以将复杂的问题简单化。它的核心思想是将一个复杂的大问题分割为多个子问题,通过解决子问题来获得总问题的解。这些子问题虽然是独立的,但是问题的本质是一样的。一个大问题可以通过分割的方式来解决,使分割后的子问题的规模不断缩小,直到这些子问题都足够简单,最后再通过子问题的解来获得总问题的解。定义一个数值列表[2,-2,5,3,-3,0,9,6],应用递归排序法将该数值列表中的元素按照由小到大的顺序进行排序。原创 2023-06-18 13:41:15 · 53 阅读 · 0 评论