数据结构
文章平均质量分 70
ljp_nan
一个普普通通的大学生
展开
-
数据结构-查找-哈希表
1、 重新开一个vector,把旧的的值直接插入到新的vector里面中去。2、我们可以重新搞一个hash表,把空间提前开好,遍历旧表插入到新表里。闭散列的---开放定址法:当前位置被占用了,按规则找下一个位置(占用别人的位置)散列表的载荷因子定义为 :填入表中的元素个数 /散列表的长度。负载因子越小,冲突概率越小,空间利用率越低。但是这种方法会导致,哈希冲突:不同的值映射到相同的位置。四、扩容以后我们的映射关系就变了,需要重新映射。二、查找的时候可以找的到,但是这个值在空的后面。一、哈希表的映射方法。原创 2024-05-13 21:48:47 · 488 阅读 · 0 评论 -
数据结构-二叉树-红黑树
当父亲是黑色的时候,插入红色节点没有违背任何的条件,如果当父亲是红色的时候,就违背了一个节点是红色的它的左右孩子都是黑色的条件。红黑树是一种二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,可以是Red或者BLACK,通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因为是接近平衡的。根是黑色的,NIL是黑色的,如果一个节点是红色的,那么它的左右孩子都是黑色,不同的路径上有相同数量的黑色节点。3、如果一个节点是红色的,则它的两个孩子节点必须是黑色的。原创 2024-05-12 16:01:23 · 449 阅读 · 0 评论 -
数据结构-二叉树-AVL树(平衡二叉树)
如果不是独立的树我们需要对parent->_parent进行保存为ppnode,然后进行判断子树是属于ppnode的左子树还是右子树修改ppnode的左右子树为cur,然后修改cur的父亲指针。3、更新后parent平衡因子==0,说明parent所在的子树的高度不变,不会影响祖先,不用再继续沿着到root的路径往上更新。4、更新后parent平衡因子==负1or1,说明parent所在的子树的高度变化,会影响祖先,再继续沿着到root的路径往上更新。然后放在parent的右边是符合搜索树的定义的。原创 2024-05-09 14:22:36 · 494 阅读 · 0 评论 -
数据结构-二叉树-二叉搜索树
最大节点为最右节点,最小节点就是最左节点 ,还需要处理要删除的节点为根节点,它没有左子树或者没有右子树的情况。如果退化成下面的情况,插入删除的效率就变成了O(N),所以我们引出了AVL树红黑树B树系列。3、两个孩子,需要进行替换,也就是替换法,用左子树的最大节点或者右子树的最小节点。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。若它的左子树不为空,则左树上所有节点的值都小于根节点的值。依次删除7、14、3、8。3、8属于需要替换法进行删除的场景。二、查找、插入、删除。原创 2024-05-06 15:07:59 · 312 阅读 · 4 评论 -
数据结构-二叉树结尾+排序
最开始存0 - 9,进行单趟排,左区间是0 4,有区间是[ 6 ,9] 可以把这两个区间入栈,每次入栈如此反复。我们可以找到最大的交换到右边和最小的交换到左边,但是如果left == maxi,一交换mini和left的值就会把maxi里的值交换到mini上。我们可以使用层序遍历的思路,利用一个队列,去完成层序遍历,但是这里会有些许的不同,我们需要让空也进队列。左边做key,右边先走(相遇后,相遇位置正好是小的),右边找比key小的。上面的排序除了归并排序外,都是内排序,也就是在内存中排序。原创 2024-05-04 15:36:46 · 1071 阅读 · 1 评论 -
数据结构-二叉树-链式(二)-OJ
左边树里面的的子树都跟右边的树比较一下,一个一个根比较,每一个节点都是根。第二步:开始比较左子树的左和右子树的右,比较左子树的右和右子树的左。这道题的坑就是我们不知道如何把接收到的返回值返回到最外面。第一步 :先比较根,然后开始比较左右子树的根;根比根,左子树比左子树,右子树比右子树。一、二叉树查找值为x的节点。根据一个字符串创建二叉树。原创 2024-04-26 17:43:24 · 181 阅读 · 1 评论 -
数据结构-二叉树-链式
比如校长要统计人数,我们就可以把任务分发给院长,然后院长在找到系主任,系主任找到班长,班长找舍长,最后由舍长上报人数。首先我们可以使用分治的思想来思考一个问题,二叉树的节点个数怎么求。我们可以这样思考,先求出左右子树的节点个数,然后返回左右子树节点的数量+根的数量。不可以这样写,这个写法相当于上面的班长,系主任,院长,校长都是只有七秒记忆的人,导致舍长要报好多遍。左右子树的递归使用同一块栈帧。根的第k层 = 左子树的第k-1层个数 + 右子树的第k-1层个数。求树的高度,也可以应用分治的思想。原创 2024-04-24 14:37:15 · 316 阅读 · 0 评论 -
数据结构-二叉树-堆(二)
所以我们可以从倒数的第一个的非叶子开始调整。也就是最后一个叶子的父亲节点开始向下调整建堆。一层一层向上进行向下调整建堆,把大的数字往上调小的数字往下沉。遍历剩下的数据,如果这个数据比堆顶的数据大,就替代它进堆(向下调整)最后这个小堆的数据就是最大的前K个。我们先可以求出最后一个孩子的下标然后应用公式 parent = (child-1)/ 2 算出最后一个孩子的父亲节点的下标。因为向下调整的过程中节点多的调整的次数少,节点少的调整的次数多。向上调整的过程中节点少的调整的次数少,节点多的调整的次数多。原创 2024-04-23 20:50:01 · 517 阅读 · 0 评论 -
数据结构-二叉树-堆
利用向上调整建大堆时我们可以交换堆头和堆尾的值。然后在进行向下调整选出次小的值,如此往复。(1)把第一个数看成一个堆中的数。后来的数进行向上调整建立堆。向下调整的过程中我们需要和儿子中最大的进行比较。这样才能保证堆的关系不变。如果存储,会浪费很多的空间。创建堆的时候会涉及到一个向上调整的算法:我们可以画图表示这一过程。这样删除的优点是 效率高,保持了大部分堆的父子关系。在内存中的存储结构,逻辑结构为想象出来的存储结构。小根堆:树中所有的父亲都小于或等于孩子。大根堆:树中所有的父亲都大于或等于孩子。原创 2024-04-22 21:44:19 · 339 阅读 · 1 评论 -
栈和队列的性质转换
3、pop时往pop栈里倒数据,之后想要pop就需要判断pop栈是否为空。1、需要分为push栈和pop栈。2、每次push往push栈里放。原创 2024-04-21 20:10:40 · 111 阅读 · 0 评论 -
栈和队列的性质转换问题
第一步:保持一个队列为空,一个队列存数据。第二步:出栈把前面的数据导入空队列。1、用两个队列实现一个栈。原创 2024-04-21 15:10:22 · 194 阅读 · 0 评论 -
链表判环问题
假设slow进环的时候fast和slow之间的距离时N,slow进环以后,fast开始追击slow每走一步,fast走2步,他们之间的距离缩小1.假设slow进环的时候fast和slow之间的距离时N,slow进环以后,fast开始追击slow每走一步,fast走3步,他们之间的距离缩小2。C-1奇数错过,C-1是偶数会追上。开始一轮追击 N-2,N-4,..... ,3,1,-1 距离变成C-1 奇数会错过,开始一轮追击 N-2,N-4,..... ,4,2,0 偶数是可以减到0的。原创 2024-04-20 14:06:56 · 194 阅读 · 0 评论 -
C++------利用C++实现二叉搜索树【数据结构】
算法思想:二叉搜索树的查找算法是这样的,从根的地方开始找,如果要找的key比根大就到右子树去找,如果比根小就到左子树找。我们要使树的高度保持为logN就必须引入平衡二叉搜索树的概念,这个部分我们在后面的AVL和红黑树部分讲解。情况d:在它的左子树中寻找最大节点,用它的值填补到被删除节点中,再来处理该节点的删除问题—替换法删除。情况b:删除该节点且是被删除节点的双亲节点指向被删除节点的左孩子节点—直接删除。情况c:删除该节点且是被删除节点的双亲节点指向被删除节点的右孩子节点—直接删除。好的我们下一篇再见!原创 2023-08-20 12:00:32 · 595 阅读 · 1 评论 -
快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。原理:规定左指针,cur指针,右指针。当a[cur] < key时,把a[cur]和a[left]的值交换cur++,left++。然后往栈里压有区间,压左区间,就像树的后续遍历一样先把叶子区间处理,再处理分支节点的区间。稳定的排序算法:冒泡排序,计数排序,归并排序,直接插入排序。不稳定的排序算法 :堆排序,快速排序,选择排序,希尔排序。空间复杂度O(范围)原创 2023-07-14 16:30:26 · 2138 阅读 · 1 评论 -
快速排序的三种方法 hoare,挖坑法,前后指针法
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。它可以先写出一趟快排,再使用递归的算法进行下一趟的排序,把left和right区间划分为了三个部分每次排序,keyi的值改变就会变化,把区间分割的越来越小,每个区间再使用一趟快排,整个区间就会有序。原创 2023-07-12 10:40:17 · 184 阅读 · 0 评论 -
排序的概念,插入排序,希尔排序,选择排序
希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书中给出的时间复杂度不唯一:总的来说希尔排序的时间复杂度为O(n^1.3)。原创 2023-07-02 10:54:55 · 741 阅读 · 1 评论 -
二叉树的练习
单值二叉树,可以使用等式的传递性来解决,根的值和左右子树的值相比较,看是否相等。递归求出是否为单值二叉树。先比较根的左右子树的根。在比较左子树的左和右子树的右,左子树的右和右子树的左。前序遍历到数组中,注意下标的传值要使用传址调用。先比比较根,在比较左右子树。函数名要保证和对应的遍历相同。调换这几条语句的顺序。原创 2023-07-01 16:52:43 · 542 阅读 · 1 评论 -
堆的向下调整算法,堆排,TopK问题
执行向下调整算法,把[0,end-1]区间内的元素向下调整为小堆,再重复以上步骤,就可以选出次小的,更小的。思路:利用前k个数据建立小堆,用堆顶元素依次和剩余的n-k个数据比较,比堆顶元素小的就入堆。概念:TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。先把堆顶元素和最后一个元素交换,执行向下调整算法,把除了最后一个元素的数组调整为小堆。注意向下调整有一个前提:根的左右子树是一个小堆,否则向下调整算法就没有意义了。第一层:1个节点 需要向上移动0次。原创 2023-07-01 10:15:52 · 152 阅读 · 1 评论 -
栈和队列(二) 队列的实现,用栈实现队列,用队列实现栈,设计循环队列
循环队列的要点:如何用一个顺序表实现一个循环队列,front为队头,rear为队尾,判满:rear + 1 == front为满,判空:rear == front 为空。使用两个栈,一个为入数据的栈,一个为出数据的栈,把数据入到入数据的栈,然后出数据到出数据的栈,基本方法如下:入队列1 2 3 4。第三步:出数据,需要先把q1中的数据1、2、3倒入q2中,然后使用QueueBack()接口获取队尾数据4。第二步:往不为空的队列里入数据,如果两个都为空,任选一个入数据。第一步:准备两个队列,开始入数据。原创 2023-06-30 17:18:39 · 236 阅读 · 2 评论 -
树的基本概念和表示方法,二叉树的基本概念以及堆的概念和插入。
如果一个二叉树深度为K,结点数为2k-1,则称为满二叉树。原创 2023-06-25 16:41:01 · 581 阅读 · 3 评论 -
栈和队列(一)
解题思路,我们可以使左括号进栈,遇到右括号时出左括号,如果不匹配返回false,如果括号序列结束了,栈中还有括号,那么说明括号不匹配,返回false,如果只有右括号,此时栈中为空,不能出栈,说明括号不匹配,直接返回false。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。在对栈初始化时我们需要考虑top的值初始化为多少,如果初始化为-1指向的就是栈顶的元素,初始化为0指向的就是栈顶元素的下一个位置。队列的实现见下一篇。原创 2023-06-22 15:22:45 · 243 阅读 · 1 评论 -
顺序表和链表的各种代码实现
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表可以分为静态顺序表和动态顺序表:静态顺序表:使用定长数组存储元素。存储结构int size;}SeqList动态顺序表:动态顺序表:使用动态开辟的数组存储。int size;//顺序表当前的元素个数//顺序表的最大容量以下是实现顺序表的接口代码:int size;}SeqList;// 对数据的管理:增删查改// 顺序表查找。原创 2023-05-12 23:20:58 · 389 阅读 · 1 评论 -
数据结构——算法的时间复杂度和空间复杂度
一般情况下,算法中基本操作重复执行的次数是为题规模n的某个函数 f(n),算法的时间量度记作TnOfnTnOfn它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度我们来进行实操// 请计算一下Func1中++count语句总共执行了多少次?i < N;k < 2 * N;++ count;FNN。原创 2023-04-10 23:01:59 · 527 阅读 · 2 评论 -
数据结构-第一章绪论
数据结构绪论原创 2023-02-18 11:06:31 · 83 阅读 · 1 评论 -
数据结构-顺序表
顺序表原创 2023-01-24 10:58:57 · 82 阅读 · 1 评论