
数据结构与算法
文章平均质量分 86
常见的数据结构与算法详解
奥耶可乐冰
这个作者很懒,什么都没留下…
展开
-
工具清单 - 看板工具
【代码】工具清单 - 看板工具。原创 2024-06-17 22:05:43 · 647 阅读 · 0 评论 -
工具清单 - IDE工具
【代码】工具清单 - IDE工具。原创 2024-06-17 22:04:47 · 607 阅读 · 0 评论 -
工具清单 - 项目管理
【代码】工具清单 - 项目管理。原创 2024-06-16 20:48:18 · 1017 阅读 · 0 评论 -
字符串匹配 - 模式预处理:朴素算法(Naive)(暴力破解)
没有预处理阶段;滑动窗口总是后移 1 位;对模式中的字符的比较顺序不限定,可以从前到后,也可以从后到前;匹配阶段需要 O((n - m + 1)m) 的时间复杂度;需要 2n 次的字符比较;很显然,朴素的字符串匹配算法 NAIVE-STRING-MATCHER 是最原始的算法,它通过使用循环来检查是否在范围 n-m+1 中存在满足条件 P[1..m] = T [s + 1..s + m] 的有效位移 s。原创 2024-06-16 20:06:43 · 365 阅读 · 0 评论 -
大数据处理 - 双层桶划分
其实本质上还是分而治之的思想,重在“分”的技巧上!适用范围: 第k大,中位数,不重复或重复的数字基本原理及要点: 因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。原创 2024-06-15 19:48:35 · 430 阅读 · 0 评论 -
大数据处理 - 分治/hash/排序
分而治之/hash映射: 针对数据太大,内存受限,只能是: 把大文件化成(取模映射)小文件,即16字方针: 大而化小,各个击破,缩小规模,逐个解决hash_map统计: 当大文件转化了小文件,那么我们便可以采用常规的hash_map(ip,value)来进行频率统计。堆/快速排序: 统计完了之后,便进行排序(可采取堆排序),得到次数最多的IP。原创 2024-06-15 19:32:51 · 1165 阅读 · 0 评论 -
安全算法 - 加密算法
加密技术包括两个元素: 加密算法和密钥。加密算法是将普通的文本(或者可以理解的信息)与一串数字(密钥)的结合,产生不可理解的密文的步骤。密钥是用来对数据进行编码和解码的一种算法。在安全保密中,可通过适当的密钥加密技术和管理机制来保证网络的信息通讯安全。原创 2024-06-14 21:36:10 · 739 阅读 · 0 评论 -
算法 - 搜索算法
每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论: 对于先遍历的节点 i 与后遍历的节点 j,有 di原创 2024-06-13 19:23:50 · 1312 阅读 · 0 评论 -
算法 - 二分法
本文主要介绍算法思想中分治算法重要的二分法,比如二分查找;二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。原创 2024-06-13 19:22:01 · 656 阅读 · 0 评论 -
回溯算法DFS
Backtracking(回溯)属于 DFS, 本文主要介绍算法中Backtracking算法的思想。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。原创 2024-06-12 19:49:20 · 1430 阅读 · 0 评论 -
- 贪心算法
保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。原创 2024-06-12 19:30:16 · 915 阅读 · 0 评论 -
动态规划算法
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。动态规划算法在算法思想中是极为重要的,需要重点掌握。原创 2024-06-11 23:03:22 · 1106 阅读 · 0 评论 -
【排序 - 基数排序(Radix Sort)】
将整数按位数切割成不同的数字,然后按每个位数分别比较。具体做法是: 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。原创 2024-06-11 23:02:36 · 392 阅读 · 0 评论 -
【排序 - 桶排序(Bucket Sort)】
假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。原创 2024-06-10 14:24:38 · 538 阅读 · 0 评论 -
排序 - 归并排序(Merge Sort)
将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并原创 2024-06-10 00:12:39 · 816 阅读 · 0 评论 -
【排序 - 堆排序(Heap Sort)】
最大堆通常被用来进行"升序"排序,而最小堆通常被用来进行"降序"排序。鉴于最大堆和最小堆是对称关系,理解其中一种即可。本文将对最大堆实现的升序排序进行详细说明。最大堆进行升序排序的基本思想: ① 初始化堆: 将数列a[1...n]构造成最大堆。原创 2024-06-09 19:32:16 · 780 阅读 · 0 评论 -
排序 - 选择排序(Selection sort)
首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。原创 2024-06-09 19:27:16 · 496 阅读 · 0 评论 -
【排序 - Shell排序(Shell Sort)】
希尔排序实质上是一种分组插入方法。它的基本思想是: 对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。原创 2024-06-08 16:56:11 · 764 阅读 · 0 评论 -
排序 - 插入排序(Insertion Sort)
直接插入排序(Straight Insertion Sort)的基本思想是: 把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。原创 2024-06-08 16:48:44 · 381 阅读 · 0 评论 -
排序 - 快速排序(Quick Sort)
选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。原创 2024-06-07 20:52:14 · 1026 阅读 · 0 评论 -
排序 - 冒泡排序(Bubble Sort)
它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾!采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!原创 2024-06-07 20:50:40 · 417 阅读 · 0 评论 -
图 - AOE & 关键路径
关键路径在项目管理计算工期等方面有广泛等应用,提升工期就是所见缩减所有关键路径上的工期,并且在实现时需要应用到之前拓扑排序的算法(前提: 有向无环图,有依赖关系)。原创 2024-06-06 22:21:17 · 396 阅读 · 0 评论 -
图 - 拓扑排序(Topological sort)
对于任何有向图而言,其拓扑排序为其所有结点的一个线性排序(对于同一个有向图而言可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。结点1必须在结点2、3之前结点2必须在结点3、4之前结点3必须在结点4、5之前结点4必须在结点5之前则一个满足条件的拓扑排序为[1, 2, 3, 4, 5]。原创 2024-06-06 22:18:48 · 994 阅读 · 0 评论 -
【图 - 最短路径(Dijkstra & Frolyd)】
所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。原创 2024-06-05 20:31:22 · 989 阅读 · 0 评论 -
【图 - 最小生成树(Prim & Kruskal)】Kruskal算法是从最小权重边着手,prim算法是从顶点出发
因为Kruskal涉及大量对边的操作,所以它适用于稀疏图;普通的prim算法适用于稠密图,但堆优化的prim算法更适用于稀疏图,因为其时间复杂度是由边的数量决定的。原创 2024-06-05 20:30:42 · 380 阅读 · 0 评论 -
【图 - 遍历(BFS & DFS)】深度优先搜索算法(Depth First Search), 广度优先搜索算法(Breadth First Search)
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。显然,深度优先搜索是一个递归的过程。广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。原创 2024-06-04 20:25:23 · 1665 阅读 · 0 评论 -
【树 - 前缀树(Trie Tree)】Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。Trie 这个术语来自于 retrieval。根据词源学,trie 的发明者 Edward Fredkin 把它读作/ˈtriː/ “tree”。原创 2024-06-04 19:57:51 · 780 阅读 · 0 评论 -
【树 - 平衡二叉树(AVL)】F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)
AVL树是高度平衡的二叉树。它的特点是: AVL树中任何节点的两个子树的高度最大差别为1。上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都原创 2024-06-03 21:05:37 · 922 阅读 · 0 评论 -
【树 - 哈夫曼树(Huffman Tree)】
哈夫曼又称最优二叉树, 是一种带权路径长度最短的二叉树。原创 2024-06-03 21:04:16 · 1408 阅读 · 0 评论 -
【树 - 二叉搜索树(BST)】(遍历、查找、插入、删除、打印、销毁)
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点。原创 2024-06-02 16:09:57 · 1023 阅读 · 0 评论 -
【线性表 - 栈和队列】线性存储结构的应用
数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用。原创 2024-06-02 15:46:10 · 375 阅读 · 0 评论 -
【散列表(Hash table,哈希表)】根据关键码值(Key value)而直接进行访问的数据结构
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2024-06-01 16:43:28 · 362 阅读 · 0 评论 -
【线性表 - 链表(优缺点、分类、实现)】n个节点离散分配,彼此通过指针相连
n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。确定一个链表我们只需要头指针,通过头指针就可以把整个链表都能推出来。@pdai。原创 2024-06-01 16:41:22 · 989 阅读 · 0 评论 -
【线性表 - 数组和矩阵】
数组是一种连续存储线性结构,元素类型相同,大小相等,数组是多维的,通过使用整型索引值来访问他们的元素,数组尺寸不能改变。原创 2024-05-31 18:28:51 · 1292 阅读 · 0 评论