
算法
文章平均质量分 57
常用算法
夏之七
立足小世界,日积跬步;沟通大世界,万川映月。
展开
-
讨论:解决哈希冲突的几种方法
设有n个d位数,每一位可能有r种不同的符号,这r种不同的符号在各位上出现的频率不一定相同,可能在某些位上分布比较均匀,每种符号出现的机会均等,在某些位上分布不均匀只有某几种符号经常出现。: 按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等。直至不发生哈希冲突。: 一旦发生哈希冲突,所有的冲突连在一起,容易产生数据“堆积”,即:不同关键码占据了可利用的空位置,使得寻找某关键码的位置需要许多次比较,导致搜索效率降低。原创 2024-03-07 11:39:06 · 990 阅读 · 0 评论 -
map和unorder_map的比较
红黑树每个节点都代表map的一个元素,对 map 的操作(查找、添加、删除)相当于是对红黑树的操作;内部实现了一个哈希表 (也叫散列表),排列无序,通过把关键码值映射都hash表中一个位置来访问记录。Hash最大的优点:是把数据的存储和查找消耗的时间大大降低,查找时间复杂度可达到O(1);:空间占用率高,因为内部实现了红黑树,每一个节点都需要额外保存父节点、子节点和红黑性质。:有序,运行效率高,可以做到在O(logn)时间内完成查找、插入和删除。优点是:可以保证最坏情况的运行也在预期之内。原创 2024-03-07 10:50:13 · 344 阅读 · 1 评论 -
无锁CAS
一、自旋锁1.1 自旋锁定义自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。自旋锁是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者。也就是说,在任何时刻最多只能有一个执行单元获得锁。1.2 自旋锁的基本形式#include <p原创 2020-12-11 14:23:24 · 418 阅读 · 0 评论 -
字符串匹配算法--BF/RK/BM/KMP算法笔记
转载:https://blog.youkuaiyun.com/bjweimengshu/article/details/104528964?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.原创 2020-11-26 14:30:04 · 851 阅读 · 0 评论 -
快速排序原理及C++源码实现
一、原理通过一趟排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。二、思路2.1 基本思路首先设定一个分界值,通过该分界值将数组分成左右两部分。将小于分界值的数据集中到数组的左边,将大于或等于分界值的数据集中到数组右侧。左右两边的数组可以独立排序:左边的数据选出一个分界值,右边的数据选出一个分界值,按照步骤2的操作,分别完成各组内介于分界值.原创 2020-11-26 12:31:15 · 227 阅读 · 0 评论 -
归并排序原理及C++源码实现
一、原理建立在归并操作上的一种有效、稳定的算法,采用分治法,先使每个子序列有序,然后将以有序的子序列合并,得到完全有序的序列。若将两个有序表合成一个有序表,成为二路归并。排序思想,一分为二,二分为四,四分为八,直到划分到最细;然后逐渐合并回去。分的时候采用递归的方式进行。二、思路先把原始序列进行分组,划分为多个子序列,对每个子序列进行排序,然后子序列之间再两两合并排序得到新的有序序列作为下一次合并的子序,然后再把新子序列合并….如此循环最后得到一个有序的序列。实例:对数据[1, 4, 2,.原创 2020-11-26 11:38:45 · 320 阅读 · 0 评论 -
希尔排序原理及C++源码实现
一、原理一个成语概括:分而治之。希尔排序是插入排序的一种,又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。二、思路先取一个小于n的整数d1作为第一个增量,把数组的全部记录分组。所有距离为d1的倍数的数据放在同一组中,先在各组内进行直接插入排序;然后,取第二个增量d2(d2<d1)重复上述的分组和排序,直至所取的增量dt=1.原创 2020-11-26 11:28:54 · 282 阅读 · 0 评论 -
插入排序原理及C++源码实现
一、原理将一个数据插入到已排好序的有序表中,从而形成一个新的、记录数增1的有序表。二、思路直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。实例:对数据[1, 4, 2, 6, 7, 3, 5, 10, 9]进行插入排序。以数组序列首元素1为有序序列,得到有序序列[1],此时数组为[1, 4, 2, 6, 7, 3, 5, 10, 9]。第一次排序:取出数组.原创 2020-11-26 11:17:54 · 244 阅读 · 0 评论 -
选择排序原理及C++源码实现
一、原理第一次从待排序的数据元素中选出最小(或者最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找最小(或最大)元素,然后放到已排序列的末尾,依次类推,直到全部待排序的数据元素的个数为零。二、思路首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有的元素均排序完毕。实例:对数据[1, 4, 2, 6, 7, 3, 5, 10, 9]进行选择排序(由小到大)。第一次排序:1与.原创 2020-11-26 11:04:12 · 195 阅读 · 1 评论 -
冒泡排序原理及C++源码实现
一、原理比较两个相邻的数,将值大的交换到右边。二、思路依次比较两个相邻的数,将较小的数放在左边,较大的数放在右边。具体步骤如下:第一次比较,比较第一个数与第二个数,较小的数放在左边,较大的数放在右边。第二次比较,比较第二个数与第三个数,较小的数放在左边,较大的数放在右边。第三次比较,比较第三个数与第四个数,较小的数放在左边,较大的数放在右边。…如此继续一次比较,直到最后两个数据比较完成,这时完成一轮的排序。最后一个数是该数组中最大的数。进行下一轮比较的时候,最后一个数值无需参加比较。.原创 2020-11-26 10:43:36 · 527 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)原理及实现
1、什么是布隆过滤器原创 2020-07-27 16:20:19 · 3978 阅读 · 0 评论