![](https://img-blog.csdnimg.cn/20190930112129691.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法设计
ZachZheng
活泼阳光,乐观自律
展开
-
递归的概念.md
文章目录递归基线条件和递归条件递归与栈的关系递归递归相对于循环而言,并没有性能上的优势,只是让解决方案更加清晰。有时候,使用循环反而效率更高。有句话说的特别好:如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。基线条件和递归条件基线条件是递归的退出条件;递归条件是执行递归循环的条件。如下所示:def countdown(i): ...原创 2018-12-17 10:42:49 · 258 阅读 · 1 评论 -
散列表
文章目录散列表散列表作为映射散列表用来排查重复项将散列表用作缓存散列表的冲突散列表的性能填装因子良好的散列函数总结参考散列表散列表主要由 散列函数 和 数组 组成,其中:散列函数: 主要是用来产生数据索引。其输入与输出是一一对应的;它知道数组有多大,只返回有效的索引;数组: 主要是用来存储数据。例如,用散列表来存储水果的价格:Python 中提供的散列表实现是 字典,例如:...原创 2019-09-30 15:54:45 · 227 阅读 · 0 评论 -
树基本概念
文章目录树的概念参考资料树的概念树是一个非常重要的数据结构。在有序的数组中进行查找时,最快的方式是二分查找(时间复杂度为 log(n)log(n)log(n));但是每当添加/删除新元素时,时间复杂度就变成了 O(n)O(n)O(n)。为了方便对数据进行查找、添加和删除,为此,有人设计了一种名为二叉查找树(binary search tree)的数据结构。如下图所示:对于其中的每个...原创 2019-09-30 15:58:11 · 96 阅读 · 0 评论 -
图:图的遍历
文章目录图的遍历广度优先搜索(BFS)深度优先搜索小结参考资料图的遍历和树的遍历一样,我们希望从图中某一顶点出发遍历图中其余顶点,且使的每一个顶点仅被访问一次。这一过程称之为图的遍历。图的遍历算法是求解图的连通性、拓扑排序和求解关键路径等算法的基础。图的遍历通常有两种方法:广度优先搜索(BFS) 和 深度优先搜素(DFS);他们对 无向图 和 有向图 都适用。广度优先搜索(BFS)...原创 2019-09-30 16:08:22 · 131 阅读 · 0 评论 -
图的最短路径
文章目录图的最短路径狄克斯特拉算法原理交换商品代码实现建立网络建立表格初始化表格搜索最短路径参考资料图的最短路径图最短路径的实现一般用 狄杰斯特拉算法。它能在一个加权图中计算从 AAA 点运动到 BBB 点的 最短路径。加权图如下所示:传统的狄杰斯特拉算法并不支持负权值,这里把狄杰斯特拉算法做了一点点改进,还是称之为 狄克斯特拉算法。狄克斯特拉算法原理第一步:建立起点(AAA...原创 2019-09-30 16:11:03 · 200 阅读 · 0 评论 -
合并排序
文章目录合并排序算法参考资料合并排序算法合并排序是利用分治算法实现的,利用分治算法解决问题需要明确以下三个问题:递归函数的返回值:返回对待排列表的排序结果;基线条件:列表(待排序列表)规模 len(arr)<=1len(arr) <= 1len(arr)<=1;递归条件,缩小问题规模:把列表均分为左右两部分,分别进行排序、返回排序结果,然后对结果进行合并,并返回合并...原创 2019-09-30 16:37:55 · 544 阅读 · 0 评论 -
计数排序
文章目录计数排序计数排序的特点计数排序其主要思想如下:获取待排集合元素最大值KKK,时间复杂度为:O(n)O(n)O(n),nnn 为元素个数;建立一个数组 Counts[K+1],用于统计每个元素的个数;时间复杂度为 O(n)O(n)O(n);基于 Counts[K],按顺序拼接待排元素。时间复杂度为 O(K)O(K)O(K);总的时间复杂度为:O(K+2n)O(K+2n)O(K+...原创 2019-09-30 16:45:21 · 78 阅读 · 0 评论 -
稳定排序的概念
文章目录什么是稳定排序?稳定排序的意义:哪些些排序方法一定是稳定排序什么是稳定排序?假设我们有如下序列:51,1,3,52{5_1, 1, 3, 5_2}51,1,3,52,其中有两个相同的 555;稳定排序与不稳定排序分别如下:稳定排序:1,3,51,52{1, 3, 5_1, 5_2}1,3,51,52;两个 555 的顺序没有变;不稳定排序:1,3,52,51{1, 3,...原创 2019-09-30 16:50:30 · 1567 阅读 · 0 评论 -
选择排序
文章目录选择排序选择排序选择排序(假设做升序排序)的主要思想是:遍历数据列表,每次选择最小的数据,其时间复杂度为:O(12n2)=O(n2)O(\frac{1}{2}n^2) = O(n^2)O(21n2)=O(n2)。代码如下:# 返回列表最小值的标签def findSmallest(arr): smallest = arr[0] smallestIndex = 0...原创 2019-09-30 16:52:15 · 78 阅读 · 0 评论 -
字符串匹配:KMP
文章目录KMP算法简介暴力算法匹配字符串KMP算法求解 $next[j]$ 函数改进 $next[j]$ 算法KMP算法简介KMP算法是一种字符串匹配算法,算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。时间复杂度 为 O(m+n)O(m+n)O(m+n),其中 nnn 为主串长度,mmm 为模式串长度。暴力算法匹配字符串用暴力算法匹配字符...原创 2019-09-30 15:40:16 · 97 阅读 · 0 评论 -
数组与链表
文章目录数组与链表数组与链表数组与链表的优缺点:数组链表内存区域连续的内存区域散乱的内存区域访问数据随机访问(即给的序号即可访问数据),时间复杂度O(1)按序访问,时间复杂度 O(n)添加元素1. 预留足够大的空间,会发生数据迁移;时间复杂度O(n) 2. 空间如果不够,需要开辟更大的内存空间,然后迁移数据;时间复杂度O(n);增加一个节点...原创 2019-09-30 11:44:56 · 101 阅读 · 0 评论 -
算法性能评价
文章目录写在前面的话算法性能评价几种常见时间复杂度对比写在前面的话文档没有任何商业因素,本着共享的精神进行分享,如有素材侵权,请给我留言;文档都是自己平时看书或工作中的笔记,观点错误的地方欢迎留言;算法性能评价评价算法的性能主要从两个方面进行评价:时间复杂度和空间规模,记录的方式通常用大 O 标记法;时间复杂度:指算法在最糟糕情况下的操作数量(一条语句作为一个操作单位),间...原创 2019-08-30 18:28:57 · 2525 阅读 · 0 评论 -
递归
文章目录递归基线条件和递归条件递归与栈的关系递归递归相对于循环而言,并没有性能上的优势,只是让解决方案更加清晰。有时候,使用循环反而效率更高。如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。基线条件和递归条件基线条件是递归的退出条件;递归条件是执行递归循环的条件。如下所示:def countdown(i): print(...原创 2019-08-31 16:22:24 · 81 阅读 · 0 评论 -
二分查找
文章目录二分查找算法二分查找与顺序查找性能对比二分查找算法二分查找也叫做折半查找,是一种效率很高的查找方法:例如:有一段有序序列1, 2, 3, 4, 5, 6, 7, 8,我们要查找6的序号:使用二分查找算法的前提条件是:数据是有序的。二分查找算法的时间复杂度为:O(log2(n))O(log_2(n))O(log2(n)),nnn 是数组长度。代码如下:#!/bi...原创 2019-08-31 16:26:57 · 96 阅读 · 0 评论 -
图:图的概念
文章目录图的概念图的抽象数据形式参考资料图的概念图是一种比线性表和树更为复杂的数据结构。其与线性表、树性结构的注意区别在于:在线性表中,数据元素之间仅有线性关系,每个数据元素之间仅有线性关系,即每个数据元素只有一个直接前驱和一个直接后驱;在树性结构中,数据元素之间有着明显的层次关系,每一层的数据元素之和下一层的孩子节点相关,和上一层的双亲节点相关;在图形结构中,任意两个元素之间都可能相...原创 2019-09-26 16:59:54 · 133 阅读 · 0 评论 -
贪心算法:集合覆盖问题
文章目录贪心算法教室调度问题背包问题集合覆盖问题NP完全问题总结贪心算法贪心算法是一种解决问题的思路:每一步选择局部最优解,最终也许不会得到最优结果,但是也会接近最优结果。贪心算法具有以下特点:每一步选择局部最优解;并非在任何情况下行之有效;贪心算法简单易实现;教室调度问题假设有如下课程表,你希望将尽可能多的课程安排在某间教室上:课程开始时间休息时间...原创 2019-09-30 09:34:28 · 21660 阅读 · 6 评论 -
动态规划算法
文章目录动态规划最长公共字串最长子序列动态规划算法的应用动态规划动态规划 就是把问题分为若干个相互独立的子问题,子问题得到解决之后,总问题也随之解决。哪些问题可以使用动态规划呢?在给定的约束条件下,求得最优解;问题可以分解为若干个相互独立的子问题。动态规划的特点:每一种动态规划的方案都可以绘制成网格;每个单元格就是子问题;单元格中的值通常就是你需要优化的;# 背包问...原创 2019-09-30 11:16:22 · 398 阅读 · 0 评论 -
几个重要的算法概念
文章目录反向索引傅里叶变换并行算法MapReduce分布式算法为何很有用映射函数归并函数布隆过滤器和HyperLogLogSHA算法局部敏感的散列算法Deffie-Hellman密钥交换参考资料反向索引一个散列表,将单词映射到包含它的页面。这种数据结构被称为 反向索引(inverted index),常用于创建搜索引擎。这里非常简单地说说搜索引擎的工作原理。假设你有三个网页,内容如下。...原创 2019-09-30 11:38:34 · 180 阅读 · 0 评论 -
分治算法与快排
文章目录分治算法(D&C)利用分治算法解决数据累加利用分治算法找出列表中的最大数**利用分治算法实现二分查找快速排序总结分治算法(D&C)分治算法是一种思想,他把一个大问题缩小为规模比较小的问题,小问题得到解决之后,大问题也随之解决。分治算法通常利用递归来实现。利用递归实现的步骤如下:明确递归函数的返回值;寻找基线条件,这种条件务必简单;实现递归体:不断将问题分解(缩...原创 2019-09-30 17:33:54 · 747 阅读 · 0 评论