
数据结构
文章平均质量分 57
数据结构中关于排序的一些笔记 算法 刷题
liujjjiyun
这个作者很懒,什么都没留下…
展开
-
寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回所在位置即可。你可以假设。你必须实现时间复杂度为O(log n)的算法来解决此问题。原创 2025-03-31 13:50:27 · 109 阅读 · 0 评论 -
多数元素
给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。32。原创 2025-03-30 21:14:32 · 751 阅读 · 0 评论 -
删除有序数组中的重复项 ||
给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素,返回删除后数组的新长度。不要使用额外的数组空间,你必须在并在使用 O(1) 额外空间的条件下完成。为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下://是以“引用”方式传递的。也就是说,不对实参做任何拷贝// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中的所有元素。原创 2025-03-30 20:19:15 · 425 阅读 · 0 评论 -
删除有序数组中的重复项
给你一个的数组nums,请你删除重复出现的元素,使每个元素,返回删除后数组的新长度。元素的应该保持。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为knumsnumsknumsnumsnumsk系统会用下面的代码来测试你的题解:// 输入数组// 长度正确的期望答案// 调用i < k;i++) {如果所有断言都通过,那么您的题解将被。原创 2025-03-30 19:54:31 · 431 阅读 · 0 评论 -
迪杰斯特拉算法
【代码】迪杰斯特拉算法。原创 2025-03-19 17:13:28 · 113 阅读 · 0 评论 -
40亿个号码如何去重?
很显然,直接用bitmap, 标记这40亿个QQ号码的存在性,然后从小到大遍历正整数,当bitmapFlag的值为1时,就输出该值,输出后的正整数序列就是排序后的结果。这是一个unsigned char类型,可以看到,共有8位,取值范围是[0, 255],如上这个unsigned char的值是255,它能标识0~7这些数字都存在。很自然地,最简单的方式是对所有的QQ号码进行排序,重复的QQ号码必然相邻,保留第一个,去掉后面重复的就行。很显然,只有123,567,890存在,所以这也就是去重后的结果。原创 2025-03-19 17:06:07 · 997 阅读 · 0 评论 -
分治算法-合并k个有序链表
【代码】分治算法-合并k个有序链表。原创 2025-03-19 16:48:51 · 327 阅读 · 0 评论 -
Kruskal克鲁斯卡尔算法
我们先判断A-D,数组0号下标的值是2,0可以到达2,即A-C是连着的,然后我们看2,2可以到达5,即C-F是连着的,我们再来看5,是-1,5走不了,即F走不了,也就是说,最终是0可以走到5,即A可以走到F,我们现在看数组下标为3的值是5,即3可以到达5,即D可以到达F,即A-F,D-F,A和D在连接之前就可以走到同一个位置了,连接以后,肯定就形成回路了。然后我们选择此时权值最小的边:B-E,我们先判断,我们看数组1号下标的值是-1,数组4号下标的值也是-1,说明B和E在连接之前,哪也去不了。原创 2025-03-18 19:45:24 · 881 阅读 · 0 评论 -
最小生成树Prim普里姆算法
U放的是已经选好的点,V集合放的是未选好的点。首先选择权值最小的节点。我们选择从A开始,A-B,A-C,A-D中,权值最小的边是A-C,加入到最小生成树当中。把C加入到U集合中,也就是选进去了。然后把剩余顶点(BDEF)的权值都和C算一下,如果谁和C的权值,比它原本和A的权值更小,就更新一下。原创 2025-03-18 19:00:35 · 335 阅读 · 0 评论 -
Dijkstra迪杰斯特拉算法
通过迪杰斯特拉算法,我们可以知道从起始节点开始,到任意一个节点的最短路径。原创 2025-03-16 19:27:25 · 1029 阅读 · 0 评论 -
倒排索引的代码实现
【代码】倒排索引的代码实现。原创 2025-03-16 19:14:21 · 124 阅读 · 0 评论 -
倒排索引结构分析
它首先在这些文档看, 看一下search和google在这个文档里的位置,有没有哪一个位置是前后的,比如说,search是10,google是11,就说明这2个关键字是连续出现的,和用户的搜索的匹配度是最高的,就优先呈现,而且关键字的前后的备注信息,就是从这2个词的前后拿一些信息作为搜索结果呈现的摘要信息。然后因为用户搜索的是“search google”,此时搜索引擎分别找到这2个关键字对应的倒排项后,会对这2个关键字的倒排项进行取交集。这2个倒排项给用户呈现结果的时候,是怎么样呈现的?原创 2025-03-16 19:11:31 · 437 阅读 · 0 评论 -
正排索引&倒排索引
在这个表里通过添加1个标志来表示这个关键字是否在当前文档里出现。实际上,不仅仅用是否存在来记录1或者0,还可以记录i在这个p1文档出现了,具体出现在哪个位置,出现了多少次,这里的1就包含了在p1文档里的详细的信息。如果建立正排索引,当去搜索“search”这个关键字的时候,实际上,通过正排索引是不能直接知道search这个关键字在哪些文档里面的。原创 2025-03-16 18:10:44 · 965 阅读 · 0 评论 -
倒排索引理论
在打开百度,或者是谷歌,360浏览器,输入关键字以后,浏览器作为客户端把关键字发到对应的搜索引擎的服务器server端,服务器去分析这个关键字,在全网的所有网页html中(几千万,上亿个文件)中快速搜索出想要的内容,输一个关键字,敲一个回车,很快的所有的搜索结果都出来了,不到1秒的时间内搜索几千万个网页。在自己的电脑上去搜索一个文件,速度却非常的慢,有时候几十分钟都搜索不出来。原创 2025-03-16 17:57:13 · 252 阅读 · 0 评论 -
字符串模式匹配-KMP算法(4)
如果按照之前讲的KMP方法这一步也是没有并要的。j和首元素都是g是相同,g和上面对应的d不相同,你移到后面,此时g和d肯定也是不相同的,没必要比较。C和F比对失败,查看next数组C对应的k值是2,更新j=2之前是ABC,C和F比对失败,现在又还是ABC,C和F比对。这样比较就没有意思了说明前面的ABC和后面的ABC是一样的,当前C与F比对失败了,前面的移过来,也肯定是C与F比对,肯定也失败。此时C在next数组就不记录2了,这个公共子串就不要了,k回退也就是说公共串不需要AB这么长。原创 2025-03-15 22:43:11 · 521 阅读 · 0 评论 -
字符串模式匹配-KMP算法(3)
这种情况就是k退到0了。原创 2025-03-15 22:34:17 · 111 阅读 · 0 评论 -
字符串模式匹配-KMP算法(2)
当我们第一次比较失败了,i5j的时候,i不变,此时查看next数组中x字符对应的k值,是2,更新j=2,进行比较下去。d前面,e前面,x前面都没有公共子串,k都是k=0。b前面是:abca,公共子串是a,P0到P0,根据。a前面有3个元素abc,但是没有公共子串,k=0。b前面只有1个字符,就没有公共子串了,k=0。c前面只有2个元素ab,没有公共子串,k=0。c前面只有2个字符,也没有公共子串,k=0。b前面只有1个元素a,没有公共子串,k=0。子串的第一个元素a,k=-1。x前面是abcab,k=2。原创 2025-03-15 20:39:19 · 220 阅读 · 0 评论 -
字符串模式匹配-BF算法的缺点
因为BF算法对我们在字符比较失败之前的比对成功的字符信息没有存储,每次就是回退到原来比较的位置上后一个位置开始重新比较。因为原本对应的abcde是相等的,现在进行第二次比较的时候回到主串的第2个位置开始比较下去,肯定是不相等的。比较失败,把j重置为2。原创 2025-03-15 20:31:16 · 307 阅读 · 0 评论 -
字符串模式匹配-KMP算法(1)
就回退一下,看“ABCDAB"当中有没有可以局部匹配的信息。最长公共串是AB2个长度,然后我们把子串的第2+1个元素后移到当前比对失败的元素的位置上,然后开始和主串比较。如果比到不相同了,就看此时比对好的子串的部分的除去当前和主串不一样的元素,前面的部分进行看,有没有最长公共子串,然后把子串的第(最长公共子串的长度+1)的元素后移到当前比对失败的元素的位置上。原创 2025-03-15 20:23:52 · 1025 阅读 · 0 评论 -
最长连续序列
找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最长数字连续序列是 [1, 2, 3, 4]。请你设计并实现时间复杂度为。给定一个未排序的整数数组。原创 2025-03-14 20:38:38 · 189 阅读 · 0 评论 -
字符串模式匹配-BF算法
从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功;如果在主串中不存在与模式串相同的子串,则匹配失败。3、第三趟比较,主串回退到比前一趟加 1 的位置,子串从 0 开始。2、第二趟比较,主串回退到比前一趟加 1 的位置。通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一。1、第一趟比较,先比较 A,然后是 BCDAB。原创 2025-03-14 16:50:40 · 317 阅读 · 0 评论 -
基数排序算法
把所有元素的个位进行排序,然后十位进行排序,然后百位进行排序,依次向高位递进,最后得到一个全局的小到大或者大到小的序列。43的个位是3,我们把43放在3号桶,47的个位是7,我们把47放在7号桶。如果元素相同,都是在一个桶里放着,而且都是 从左到右遍历,从左向右放进桶的。开辟的桶的大小,存放的是所有的元素,所以空间复杂度是O(n)先利用所有元素的个位和桶的序号进行比较,相等的话就放进去。而且最后桶里的元素也是按左右顺序依次拷贝到原序列中.因为最长的数字是2位。11的个位是1,我们把11放在1号桶。原创 2025-03-14 13:36:44 · 315 阅读 · 0 评论 -
排序算法 常见问题3(公司真题)
(空间复杂度最大,1次只能排序1部分,没有排序的在磁盘上,磁盘I/O操作多)。在事先不了解数据特征,在最坏,最好,平均的时间复杂度都是O(nlogn)。只有归并排序可以进行外排序(磁盘上的数据排序,其他排序算法都是内排序)外排序涉及的是磁盘I/O,效率比较低。数据是1G,内存是1G。原创 2025-03-13 20:00:51 · 196 阅读 · 0 评论 -
排序算法 常见问题2
在sort源码,通过参数_Ideal(元素的个数)。原创 2025-03-13 19:57:27 · 201 阅读 · 0 评论 -
排序算法 常见问题1
Ideal来控制栈的深度,是为了让树趋于平衡的情况,如果超过这个,认为此时序列趋于有序,认为树的倾斜度高,而且如果元素过多,快排递归次数过多,会把栈撑破。此时每段序列比较短,适合堆排。如果用归并,占用额外的内存空间会比较多。控制到1.5倍的log以2为底的n。_Ideal是元素的个数。原创 2025-03-13 17:00:47 · 251 阅读 · 0 评论 -
字母异位词分组
给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。是由重新排列源单词的所有字母得到的一个新单词。原创 2025-03-12 20:38:56 · 99 阅读 · 0 评论 -
希尔&快排&归并&堆排-性能测试
但是归并要开辟额外的内存空间,存放当前合并的有序的序列,然后拷贝到原始的序列中,这就是归并比快排慢一点点的地方。快排的最坏时间复杂度是O(n^2),但是场景是有序的序列,现实中数据量很大,有序的概率是非常低的。原创 2025-03-12 19:41:14 · 221 阅读 · 0 评论 -
堆排序算法
就是图中的值为8的节点然后进行一个大根堆的调整。原创 2025-03-12 18:48:18 · 700 阅读 · 0 评论 -
归并排序算法
因为对于底层的62序列和99序列,我们认为是已经有序的了,它们两个在归的过程中要往父节点归,归的过程中就要把这2个分别有序的序列合并成1个全局有序的序列。树的层高:O(logn),在每一层,都要进行序列数据的合并,每一层要合并的数据可以看作是n个,是O(n),递的过程是缩减数据规模到头,规模小到结果是已知的,然后归的过程是在计算各个规模的结果,累计出原始数据规模的结果。把这个空间中合并的全局的有序序列的结果返回父节点,对应的0-1号的数组位置中。j越界了,然后把i的序列中的值按顺序放进去。原创 2025-03-12 18:38:37 · 931 阅读 · 0 评论 -
冒泡&选择&插入&希尔算法性能分析
【代码】冒泡&选择&插入&希尔算法性能分析。原创 2025-03-09 23:35:28 · 196 阅读 · 0 评论 -
希尔排序算法
是按顺序从左到右,依次定位到元素,然后在前面已排序的序列中找到合适的位置插入。也就是说,随着插入排序的进行,只是前面那部分是有序的,从整体上表现出来,并不是越排越有序。原创 2025-03-09 23:33:45 · 1006 阅读 · 0 评论 -
插入排序算法
认为25是有序的序列,然后把40按照顺序插入到其前面已经有序的序列,因为前面已经是有序的序列,所以40就往前找,找第一个小于或者等于40的数字,插入到其后面。:处理25这个元素,25前面是有序的序列了,然后25往前找第一个小于或者等于25的元素(维护其稳定性),插入到其后面。处理元素9,9前面已经是有序的序列了,9往前遍历,寻找第一个小于等于9的元素,插入到其后面。然后25和25比,25==25,就插入到25的后面,保持其稳定性。后面的元素是不会跑到前面和它相等的元素的前面的,只会跟在其后面。原创 2025-03-09 23:26:00 · 299 阅读 · 0 评论 -
快速排序算法
平衡的二叉树。原创 2025-03-09 23:15:03 · 1288 阅读 · 0 评论 -
选择排序算法
不稳定性因为:举个例子,比如说在选择排序算法中,第一题,以0号位置的5作为定位,然后向后找最小值,和首位置的5交换,遍历完,找到3是这个序列中最小的值,然后把3和首位置的5交换,这样,原本在0号位置的5变到了1号位置的5的后面位置了。相同元素5的相对位置发生了改变。这样就是不稳定了!!!原创 2025-03-09 12:40:45 · 442 阅读 · 0 评论 -
冒泡排序算法
上图是无序的数据,要进行排序。冒泡排序就是: 每一趟都是从开始的这个元素,两两进行比较,把大的元素往下交换(沉淀到底),把小的元素往上交换(冒泡),每一趟操作的数据都是除去前面的每一趟沉淀到底的数据之外的数据。 每一趟处理的方式是一样的,只是数据量是不同的。 第一趟:从开始的这个元素,两两进行比较,把大的元素往下交换(沉),把小的元素往上交换(冒泡) 第一趟下来,整体没排序,但是把整个序列的最大值94沉到底了。 第二趟:不用处理94原创 2025-03-08 13:37:16 · 948 阅读 · 0 评论 -
包含min函数的栈
【代码】包含min函数的栈。原创 2025-03-08 13:12:21 · 270 阅读 · 0 评论 -
T树(字典树)
来判断这个结点是不是元素类型,如果是元素类型就和这个值比较,如果不是元素类型,就是分枝结点类型。去字符串的第一个字符,查找对应的下标,对应的下标的连接的结点。如果是元素类型就停止查询,进行字符比较大小。最上面一排是一个个的分枝结点(对应着0-26下标,英文字母是A-Z)分枝结点放着一个个指针,如果我们查询CHAO,或者是CHANG,查询的方式是:靠关键码的分量来确定,不超过关键码的长度。依次插入 “data" 4 (空的,申请一个元素结点)然后插入"eye" 3(申请一个分枝,挂接)原创 2025-03-08 13:07:44 · 412 阅读 · 0 评论 -
B+树的建立
我们首先插入8,购买一个节点,这个节点既是叶节点又是根节点。这个叶节点的构成如下把8放在0位置我们接着插入11,把11放在1号位置。我们接着把14放在2号位置。我们接着把16放在3号位置。我们接着把19放在4号位置。我们接着把21放在5号位置。这个时候,叶节点的元素个数超出了最大范围。我们只能再购买一个叶节点,从3号位置把数据移动到新的节点的位置。由于这两个节点的双亲为空,我们再购买一个分枝节点,把k0的16放到分枝节点的k1位置。原创 2025-03-08 12:57:52 · 242 阅读 · 0 评论 -
初识B+树
/记录集int num;//节点的元素个数//节点的类型//双亲//存放关键码unionstruct//记录集//如果是叶子,这个起作用//如果是分枝,这个起作用,//防止这三指针重叠,因为在同一个联合体里面}BNode;}BTree;原创 2025-03-08 12:50:51 · 334 阅读 · 0 评论 -
B树的删除
可以分为如下情况:把n替换o我们变相地是对n删除,把个数3减为2。如果我们现在要删除n了,找到它的直接前驱m,但是个数是2,我们找直接后继,如果后继的数据是3,就可以把q覆盖n,然后进行数据的移动,个数减1,为什么是先左后右,就是左边不用移动数据!对分枝结点的删除,都是去找它的直接前驱或者直接后继,变成对叶子的删除!我们的5阶B-树的要求是最小元素个数是2,最大不超过4个,如果把j删除,这个结点就不符合要求了!如果我们要删除j,下一个动作是什么?先借后并!原创 2025-03-08 12:45:06 · 761 阅读 · 0 评论