自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一寸一寸光阴

我一定要拥有的是只属于我自己的独特人生

  • 博客(218)
  • 收藏
  • 关注

原创 8.2.3希尔排序

一个叫希尔的人发明的排序所以叫希尔排序。是插入排序的优化,插入排序的时间复杂度主要来自于比较+移动的次数,假如开始是一个有序/基本有序的序列,则移动的次数会减少,则插入排序的时间复杂度会降低,所以希尔排序是先追求表中元素部分有序,再逐渐逼近全局有序的过程把表里的元素拆分成一个个子表,每一趟处理中设置增量d,相距距离为d的元素会被看成是一个子表,把子表里的元素会进行直接插入排序第一趟排序。设置d1=元素总数/2=8/2=4,相距距离为d1的元素都是子表元素,如1号位的49相距距离为4的元素是1+4=5号位的7

2025-07-10 21:13:40 509

原创 8.2.1+8.2.2插入排序

当前元素Index为i=11,用A[0]记录当前位置元素防止被覆盖A[0]=A[11]=10,上同经过一系列处理,high最终停在0号位,low停在1号位,low>high折半查找停止,此时[low,i-1]即[1,10]范围内的元素都比当前元素大,则该范围内的元素都要右移一位,给10腾出一个位置,最右边的元素占了A[i]的位置,然后A[low]位置被腾出,再把A[0]保存的当前元素复制到腾出的位置A[low]=A[1]=A[0]=10。),则可以使用折半查找。

2025-07-06 21:02:44 829

原创 8.4.2_2堆的插入删除

删除元素13所在位置为2号位,2号位左右子树为4号位17和5号位45选更小的4号位17(比较1次),46和17比较根节点46>17交换(比较2次),此时46在4号位继续下坠,4号位左右子树为8号位53和9号位32选更小的9号位32(比较3次),46和32比较根节点46>32交换(比较4次),此时46在9号位继续下坠,9号位左右子树为18号位和19号位>len=9,即9号位没有子树了下坠不了了,删除调整结束。如下所示要在小根堆里插入元素46,首先把新元素46放到表尾即10号位,逻辑视角的小顶堆的堆底。

2025-07-06 17:48:11 218

原创 8.4.2_1堆排序

从内存/物理视角看是连续存放的数组,但是从逻辑上来看是一个顺序存储的完全二叉树。

2025-07-06 16:52:15 600

原创 8.5_2基数排序

长度为n的线性表:即长度为n的待排序无序序列,

2025-07-05 21:05:54 804

原创 8.5_1归并排序

把两个或多个有序序列合并成1个定义3个指针i、j、k,i指向有序序列1当前值,j指向有序序列2当前值,i和j比较大小,小的放在k所指位置上,再让k指针右移和值小的i或j右移第一轮,i=12,j=7,i>j,把7放在k所指位置,k右移,j右移指向10第二轮,i=12,j=10,i>j,把10放在k所指位置,k右移,j右移指向21第三轮,i=12,j=21,i<j,把12放在k所指位置,k右移,i右移指向16第4轮,i=16,j=21,i<j,把16放在k所指位置,k右移,i右移指向24。

2025-07-02 21:14:41 658

原创 4.2_1朴素模式匹配算法

主串:想从该串获取结果的串模式串:想搜索的内容,不一定在主串中能搜到,子串一定能在主串中搜到字符串模式匹配:在主串找模式串并返回找到的第一个模式串所在位置。

2025-06-26 21:41:00 763

原创 4.1_2串的存储结构

subString(),Sub是空串用来返回目标子串,S为原串,pos截取子串的初始索引下标(因为char[0]的第一个位置没用,所以索引下标==位序)不包括该下标元素,len为截取长度,如pos=5,len=2,即截取如下主串中的下标为6-7字符,即截取a和o,把截取的每个字符依次放到Sub结构体中的ch[]数组里,注意数组下标越界问题,即pos+len<S主串长度,比如pos=5,len=7,则从下标为5开始几d字符开始,截取7个字符,很明显主串中下标为5之后没有7个字符,即数组下标越界。

2025-06-26 20:29:59 912

原创 4.1_1串的定义和基本操作

跟java中的一样,不过子串或者字符在字符串中的位置是从1开始而不是从0开始。空串也是字符串的子串,空串长度为0子串在字符串中的位置为子串的第一个字符在字符串中的位置每个空格字符占1B。

2025-06-25 21:16:36 240

原创 7.5.4散列查找的性能分析

就是扎堆,一个接一个放,都把位置占满了,新元素只能从头走到尾放在最后一个元素,则新元素插入和查找的效率都低,如果不扎堆,即中间有空单元,那查找一个不存在的元素所经历的查找长度就短了,即ASL变小。即1号位上的元素为14,则比较1次查找长度为1,插入元素1时,初始散列地址为1号位,1号位已有元素14,则找下一个空闲冲突散列地址2号位即把1存储在2号位,在查找时,先查找初始散列地址1号位上的14不相等,根据探测序列查找下一个冲突散列地址2号位,1==1即比较次数2次,查找长度为2,,剩下地依次类推。

2025-06-25 20:32:24 616

原创 7.5.3_2处理冲突的方法-开放定址法

新元素可以插入到已经被逻辑删除的元素的位置,但是在查找的时候还要经过这些元素,比如如下图假如目标元素1前边的冲突散列地址上的元素都已经被逻辑删除了,但是还要从第一个冲突散列地址上开始查找目标元素1,则效率低下,即散列表看起来很满,但是实际很空,所以为了提高效率,则建议定期清理数据,即把已经逻辑删除的元素全都真正物理删除,然后把实际还存储在散列表中的数据根据要求的探测序列再重新放到该放的位置上,则散列表在查找的时候就不用再经过逻辑删除元素了。

2025-06-24 21:30:37 824

原创 7.4.2B+树

磁盘是一个慢速设备,每次要读取磁盘块数据都会花费大量时间,因此假如B+树高度越高就意味着在读取磁盘的过程中读取次数越多,导致查找速度更慢,如何降低B+树高度,即让B+树节点存储更多的关键字,即这也是为什么B+树上的非叶子节点不存储实际的记录地址了,这样能节省更多的空间来存储关键字,并且这些一个个节点是存储在每个磁盘块中,而每个磁盘块大小基本固定如1kb,而让每个磁盘块包含尽可能多的关键字的信息,当节点的空间大了则每个节点存储的关键字就多了,则磁盘上就包含了尽可能多的关键字信息了。

2025-06-23 20:57:40 786

原创 7.4.1_2B树的插入删除

假如是m阶B树,插入关键字时都要满足每个节点上的关键字个数最少为m/2向上取整-1关键字,最多有m-1个关键字,且每次插入的新元素一定是放在最底层的终端节点(因为如果不是放在终端节点,会导致该节点上可能有叶子节点,则就不满足B树的叶子节点一定在最下层的特性了)如下例子是5阶B树即m=5,则每个节点的关键字个数满足2<=n<=4先插入25关键字,然后插入38,38>25,则插入在25的后边,插入49关键字,49>38,49放在38的后边,插入60,60>49,60放在49的后面,以上插入元素节点上的关键字个数

2025-06-22 21:31:33 997

原创 7.4.1_1B树

设k=m/2向上取整第一层1个节点,1个关键字第2层2个节点,2(k-1)个关键字(因为除了根节点之外,每个节点的关键字个数至少为k-1,每个节点的分支/子树节点至少为k)第3层2K个节点,2k(k-1)个关键字(因为除了根节点之外,每个节点的关键字个数至少为k-1)第4层2K²个节点,2K²(k-1)个关键字(因为除了根节点之外,每个节点的关键字个数至少为k-1)........

2025-06-22 17:42:53 760

原创 7.5.3_1处理冲突的方法-拉链法

散列表中头插法插入元素时,每次插入的元素都是无序的,导致在散列表查找元素时,只能顺序的在链表一个一个元素挨个比较,效率低,则在链表插入时可以比较元素大小,让链表插入的时候保持一个有序的状态,根据大小把元素插入到链表对应位置,即在插入时也排序,则在查找时效率会高一些。如查找目标元素66,由散列函数计算出的散列地址为1,从1对应上的链表从头开始顺序查找,先比较79,不相等继续比较27,不相等继续比较1,不相等继续比较14,链表上的元素比较完了也没找到66,则查找失败,关键字比较次数4次,查找长度=4。

2025-06-22 15:19:26 257

原创 7.5.2散列函数的构造

(注意分布均匀不是指这几个数码位相同,而是指不同吧,即出现的概率相同),如下手机号例子,前三位是固定的运营商,中间4位是区号,即前7位数字出现都受到影响,剩下4位每个人的手机号各不相同,跟运营商和区号无关,即末尾4位就是0-9数字的任意组合,末尾4位出现的概率相同,即分布均匀,则可用末尾4位散列地址,末尾4位则要设计10000个地址,即散列表长度为0-9999,则把4位出现的数字直接对应到散列表的地址中就行,如手机尾号为2875的手机号直接放到散列表2875的地址上就行。与质数相反的是合数(如4)。

2025-06-22 14:43:58 238

原创 7.5.1散列表的基本概念

如下例子:散列表长度为13,给出散列函数H(key)=key%13,即数据元素在散列表存储位置的计算方式是数据元素对13取余,一组数据元素19,14,23插入散列表,19在散列表存储位置=H(19)=19%13=6,即19存储在散列表位置为6的位置,14在散列表存储位置=H(14)=14%13=1,14存储在散列表1的位置,H(23)=23%13=10,即23存储在散列表10的位置。冲突:在散列表插入数据元素时,根据散列函数计算出的应存在散列表的地址上已经有了其他元素,这种情况就叫冲突或碰撞。

2025-06-22 13:56:57 164

原创 7.3.3_3红黑树的删除

和平衡二叉树、二叉排序树删除同,但是删除节点后可能会破坏红黑树红黑特性,所以可能要调整节点的颜色位置使其再满足红黑树特性。又水一篇,也不知道考不考。

2025-06-22 12:45:19 132

原创 7.3.3_2红黑树的插入

1.确定先插入哪个节点位置(因为要满足二叉排序树性质左<根<右)2.插入完之后破坏平衡,要调整平衡-》调整平衡步骤为先找最小不平衡子树,再去看属于4种情况的哪种情况进行调整。。。。。。。1.先根据二叉排序树(左<根<右)确定要插入要新节点的位置,插入新节点2.根据新节点的位置对新节点染色。如果新节点的位置是根,则染为黑色,不是根染为红色(这个是因为要满足红黑树黑路同的特性,如果开始只有只有根节点A节点,然后在A的左子树插入了B节点,如果B节点是黑节点,则A从左子树到叶子节点的路径上包含的黑节点现在是2个,A

2025-06-22 12:36:47 853

原创 7.3.3_1红黑树的定义和性质

红黑树是二叉排序树的一种优化,则红黑树有二叉排序树BST的特性,即节点值左子树<根节点<右子树(左<中<右) ,每个节点上除了有左子孩子指针外,还有节点的颜色color1.红黑树的节点的颜色要么是黑色要么是红色2.红黑树中的叶节点一般指的是查找失败的节点,叶节点又叫NULL空节点或者外部节点,注意不是最下层的节点,二叉排序树中的查找失败的节点也是NULL节点即不存在的节点,根节点和叶节点一定都是黑色的节点。

2025-06-21 20:01:21 525

原创 7.3.2_2平衡二叉树的删除

平衡二叉树具有排序树的特性,即节点值左子树<根节点<右子树(左<中<右),在二叉排序树的基础上保证每个节点都是平衡的,即每个节点的左右子树的高度之差不超过1平衡二叉树的删除节点操作和插入操作节点类似,删除之后要满足二叉排序树特性即节点值左<中<右,且要满足平衡特性即删除节点之后某个节点的左右子树的高度之差>1了之后导致不平衡,要和插入节点操作一样去调整平衡删除9节点叶子节点=====》不需要调整平衡步骤1,平衡二叉树删除节点方法和二叉排序树删除节点同,删除是叶子节点9直接删除步骤2,从删除节点一路向北不断找

2025-06-21 18:08:53 596

原创 7.3.2_1平衡二叉树

定义:树上任一节点的左子树和右子树的高度之差不超过1。简称AVL树(大佬们的缩写,注意区分ASL平均查找长度),当是平衡二叉树时,树的高度能达到log2n,有助于查找效率提高节点的平衡因子=该节点的左子树高度-该节点的右子树高度(注意高度不包括该节点所在层)。如下:根节点50的左子树高度为2,右子树高度为3,则根节点的平衡因子=2-3=-1因为任一节点的左子树和和右子树高度之差不超过1,所以平衡二叉树的平衡因子只能是0,-1,1,只要有任一节点的平衡因子绝对值>1,那么该二叉树就不是平衡二叉树。

2025-06-21 15:24:17 716

原创 7.3.1二叉排序树

又叫二叉查找树BST,满足左子树节点值<根节点值<右子树节点值,根节点的值>所有左子树的节点值,右子树的任何一个节点值>根节点值,各个子树又递归满足左子树节点值<根节点值<右子树节点值,进行中序遍历时左根右,则可以得到一个递增序列。

2025-06-20 21:44:23 676

原创 2.1线性表的定义和基本操作

线性表就是各个数据元素之间的逻辑结构关系是一条线的结构,各个数据元素被穿到一起前后有次序,线性表中的各个数据元素数据类型相同即各个数据元素所占的存储空间一样大,数据元素个数有限且有次序的序列(如果说所有整数不能构成一个线性表,自然是不能的,因为虽然满足各个数据元素类型相同都是int型且有序,但是无限)线性表的长度n(就是数据元素个数吧)称为表长,当n=0时,线性表是一个空表位序:一个数据元素在线性表中的第几个位置,注意是从1开始的,但是数组下标是从0开始的。

2025-06-19 19:18:20 266

原创 7.2.3_分块查找

19,查找下一位19==19,查找查找成功。采用顺序查找索引表:如查找7,先查找索引表1次(关键字比较1次),10>7确定分块,再顺序查找10块下的7一次就查找成功(关键字比较1次),即一共关键字比较2次,如查找10,先查找索引表1次(关键字比较1次),10>=10确定分块,再查找10块下的元素,比较7和10,查找成功(关键字比较2次),即一共关键字比较3次,查找13上同,索引表顺序比较10、20确定分块在20下,即关键字比较2次,再在20块下比较13查找成功,块下元素比较1次,即一共关键字比较3次。

2025-06-17 21:23:26 681

原创 5.5.2_2并查集的进一步优化

Find操作优化后(压缩路径):find操作压缩路径后会让树的高度不超过O(α(n)),则find操作的时间复杂度是O(α(n)),在进行n个独立元素的union操作时需要n-1次union,且进行union操作时先find再union,而find的时间复杂度是O(α(n)),则union操作时间复杂度为O(α(n))[即(n-1)*O(α(n))=O(nα(n))]find操作主要是通过S[]数组一路向北来找给定节点的根节点,从给定节点到找到根节点所经过的节点路径称为查找路径。

2025-06-15 16:46:27 406

原创 5.5.2_1并查集

并查集就是一种集合,合并+查找====》集合集合中元素只有2种关系,属于这个集合或者属于另外一个集合(或者说不属于这个集合)一个集合里有好多元素,把同类型的元素构造成一棵树,其他类元素构造成另外一棵树,这个元素属于哪个集合就用这棵树的根节点表示,讨论哪个元素属于哪个集合,就是找这个元素所在树的根节点。森林是由多个互不相交的树构成的用互不相交的树来表示集合的用途:1.判断某个元素属于哪个集合------》从该元素出发,一路向北查到该元素所在根节点,根节点是哪个就是哪个树,哪个集合2.判断2个元素是否从属相同集

2025-06-15 16:03:02 555

原创 3.2.1_队列的基本概念

队尾:允许插入数据元素的一端叫做队尾(从哪个口插入元素的一端叫队尾),最靠近队尾的元素叫队尾元素(最靠近插入口的元素)队头:允许删除数据元素的一端叫做队头(从哪个口删除元素的一端叫队头),最靠近队头的元素叫队头元素(最靠近删除口的元素)定义:队列和栈都是一种操作受限的线性表,队列只允许一端插入,另外一端删除,先进先出(FIFO)空队列:队列里没有任何元素。

2025-06-15 13:16:00 227

原创 3.1.3_栈的链式存储实现

头插法建立单链表:每次要插入一个元素的时候,总是把该元素插在头节点之后的位置,如果规定只能在单链表的链头一端进行操作即为进栈操作每次删除一个元素的时候,规定只能在单链表的链头位置进行操作,即为出栈操作链栈定义和单链表类似,带头结点和不带头结点的判断不一样(单链表早忘了。。。。。

2025-06-14 21:11:48 232

原创 3.1.2_栈的顺序存储实现

顺序栈是用顺序存储实现的 ,代码定义方式和顺序表类似(啥是顺序表来着???定义一个顺序栈struct结构体SqStack,结构体中有静态数组data来存放栈里边的元素+1个int型的top指针用来指向栈顶元素(该指针一般记录的是栈顶元素的索引下标,data数组索引下标从0开始),声明一个顺序栈SqStack S;

2025-06-14 20:58:15 862

原创 5.5.1_哈夫曼树

重点是哈夫曼树的构造和哈夫曼树的编码带权路径长度:节点的权:给树里边的节点赋上一个叫权的东西,然后给权赋予现实意义。如给某个节点赋的权值大小就是表示节点在树里边的重要性节点的带权路径长度:从根节点到该节点经过了几条边x该节点上的权值=节点的带权路径长度。如下最下边的权值为3的节点,从根节点(权值为1的节点)到该节点有3条边,且该节点权值为3,则该节点带权路径长度=3*3=9树的带权路径长度(WPL):为该树的所有的叶节点的带权路径长度之和哈夫曼树定义:把含有n个带权叶节点的多个二叉树中的树的带权路径长度(w

2025-06-14 19:59:20 606

原创 8.4.1简单选择排序

n个元素,要进行n-1趟排序,i从0开始,则要i< n-1进行n-1趟循环,用min变量记录最小元素位置,双层for循环,第一层记录本趟排序从i位置开始,第2层记录本趟循环最小元素位置,第2层for循环遍历完后如果min元素和开始排序的元素不相等,则交换开始排序i位置的元素和最小元素位置。从还没排序的元素的位置从左到右一趟趟找,每次都找值最小的,然后和当前待排的第一个元素交换位置,直到剩下最后一个元素,每排序一个元素下一趟就不再找该元素了,从下一个元素开始排序。

2025-06-13 20:07:28 364

原创 5.4.1树的存储结构

在找某个节点的孩子时,直接找该节点对应的firstChild字段指向的链表即可找到所有孩子节点的index位置,找孩子方便,在找某个节点的父亲时,只能遍历所有的节点的链表,然后找出firstChild指向的孩子链表中有该节点的元素,对应的data即为该节点父亲,即找父亲时不方便,适用于找孩子多,找父亲少的情况,如服务流程树,拨打电话普通话服务请按1,然后再问你办理业务1按#键啥的,,,,直到找到最下一层服务节点。用数组记录每个节点的父节点在数组中的索引位置,纯顺序存储。

2025-06-12 21:40:24 856

原创 8.3.1_冒泡排序

变量j-1:即数组中的最后一个元素位置,用来比较index=j和index=j-1位置上的元素的值大小,如果[j-1] >A[j]交换位置,如果A[j-1] =A[j]不改变位置用来保持算法的稳定性,如果A[j-1]<A[j]位置不变。第3趟冒泡,有n个元素需要比较n-3次(两两比较,但是因为前2个元素已经排好序了,不用再比较了,即只需两两比较n-2个元素,需要比较n-3次),交换n-3次。第2趟冒泡,有n个元素需要比较n-2次(两两比较,但是因为第一个元素已经排好序了,不用再比较了),交换n-2次。

2025-06-11 21:57:07 423

原创 5.4.2树、森林与二叉树的转换

先画一个根节点A,开始从上到下从左到右处理第一层的A节点,A有B、C孩子,用右指针把B、C连起来,然后把第一个孩子B挂在当前节点A的左指针指向下边,此时C是B的右孩子,B是A的左孩子,再处理第2层B、C,从左到右先处理B,B有3个孩子D、H、F,用右指针依次连起来D-H-F,然后把第一个孩子D放到B的左指针下边成为B的左孩子,H成为D的右孩子,F成为H的右孩子。2.从树的根节点开始,按树的层序恢复每个节点(注意是树的层序,不是二叉树的层序,从上到下、从左到右的顺序)1.先画出树的根节点。

2025-06-11 21:10:04 693

原创 5.3.2_2二叉树的线索化

过程和上边土方法同。执行执行执行,访问访问访问。解决办法看图3,在访问节点的左孩子的时候查看左孩子指针是否是线索指针,如果不是才去访问是的话不再访问否则就又去访问上一个前驱节点了(因为当前节点在访问时会补充前驱节点,即让左孩子指针指向前驱节点,而先序遍历是先访问当前节点,再去访问当前节点的左子树节点,这样如果开始左孩子为空,再补充了前驱节点后左孩子又不为空又去访问前驱节点了,比如第一次访问A,再访问A的左孩子B,B没有左孩子但访问B时B的左孩子指向了前驱A,然后再访问B的左孩子时又开始访问A,变成循环)。

2025-06-07 20:52:22 863

原创 7.2.2_折半查找

查找成功概率:一共有11个数,每个数被查找的概率相同记为1/11,查找成功过程如下:第一层有1个数,和该树比较1次,第2层有2个数,如13,需要先和29比较再和13比较即比较2次,37同,则2次*2个数,第3层4个数,每个数都需要比较3次,如10,需要先和29、13比较再和10比较即比较3次,剩余数同级3次*4个数,其他层也同则平均查找长度=各个关键字比较次数之和X每个关键字查找概率即ASL(成功)=(1*1+2*2+3*4+4*4)/11=3。折半查找判定树一定是平衡二叉树(啥叫平衡二叉树来着?

2025-06-07 17:59:44 955

原创 5.3.2_1线索二叉树的概念

如下所示中序序列DGBEAFC,D的左孩子指针指向NULL,且前驱没有即没有在D之前访问别的节点即D的左孩子指针指向null,右孩子指针指向G不变,G的左右孩子指针都是空链域,G的前驱是D后继是是B让G的左孩子指针指向D,G的右孩子指针指向B,B的左右孩子指针都不是空链域则不变,E的左右孩子指针都是空链域且E的前驱是B后继是是A让E的左孩子指针指向B,E的右孩子指针指向A,F和C同。某个节点的中序:在中序序列中该节点的右孩子指针指向的后继节点(在中序序列中紧挨着该节点且在该节点后面的节点)

2025-06-07 12:42:07 862

原创 5.4.3树和森林的遍历

如下:根节点为A,A的子树为B、C、D,即A BCD的顺序,再从左到右对B的子树进行先序遍历根左右即BEF(即对B进行拆分),E还有分支,再对E的分支进行先序遍历访问即EK则为ABEFK,再对A的子树C进行先序遍历即CG,再对D的子树进行先序遍历,先H且H无分支再对I节点进行访问I无分支再对J进行先序遍历访问J无分支则结束。如下图对根节点为B的树进行后根遍历(左右根),上同例子为KLEFB,再对根节点为C的树进行后根遍历,即GC,再对D根节点进行后根遍历即MHIJD,合在一起即为KLEFBGCMHIJD。

2025-06-06 21:14:30 409

原创 8.1_排序的基本概念

让关键字按递增或递减的顺序排列,在排序中关键字可重复。

2025-06-06 20:17:18 263

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除