![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构 & 算法
lin-0410
最痛苦的事情,不是失败了,而是我本可以......
所以,如果目标还没去实现,不要感叹为时已晚,因为种一棵树最好的时间是十年前,其次是现在!
展开
-
数据结构系列,红黑树
红黑树红黑树的底层数据结构就是一棵二叉查找树(自平衡的二叉查找树)二叉搜索树也叫二叉查找树,二叉排序树。每个结点不是红色,就是黑色 不可能有连在一起的红色结点,两个黑色结点连在一起是可以的。 根结点是黑色。 每个红色结点的两个子结点都是黑色,叶子结点都是黑色,红黑树的变换规则:改变颜色,红变黑,黑边红 左旋 右旋旋转和颜色变换规则:所有的插入的点...原创 2020-01-12 17:05:24 · 186 阅读 · 0 评论 -
数据结构系列,二叉平衡树的构建
平衡二叉树平衡二叉树,首先要是一种二叉排序树,然后,其中每一个结点的左子树,右子树的高度差(左子树的高度 – 右子树的高度)至多等于1,二叉树的高度就是这棵树有几层。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,所有结点的平衡因子的值,只可能是-1, 0, 1。只要二叉树上有一个结点的平衡因子绝对值大于1,则该二叉树就是不平衡的。距离插入结点最近的,且平衡因子...原创 2020-01-12 14:19:21 · 4925 阅读 · 0 评论 -
数据结构系列,二叉排序树的结点删除、重排
二叉排序树又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值。 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。 它的左右子树,也分别为二叉排序树。构造一棵二叉排序树的目的,不是为了排序,而是为了提高查找、插入删除关键字的速度。二叉树的删除,需要保证一点,不能因为删除了结点,而让这棵树变得不满...原创 2020-01-11 16:16:26 · 2114 阅读 · 0 评论 -
数据结构系列 二叉树的遍历(顺序存储)
https://blog.csdn.net/lin20044140410/article/details/89436835二叉树链式存储数据结构-树树是一种一对多的数据结构,是n(n>=0)个结点的有限集。N=0时为空树。在任意一棵非空树中:1,有且只有一个特定的称为根root的结点,2,当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1,T2,,,,Tm,...原创 2020-01-08 13:39:27 · 5037 阅读 · 1 评论 -
数据结构系列-链栈的基本操作
栈的链式存储结构,可以称为链栈。针对单链表的链栈,栈顶指针就是头指针。对于链栈来说,不存在栈满的情况,当然是内存足够的情况下。对于空栈来说就是top =NULL。相对的顺序栈要实现确定一个固定的长度,但是顺序栈存取时的定位很简洁。链栈对于长度没有限制,但是每个元素要多个指针域,也就多了一些内存开销。链栈的存储结构及操作:#include "stdio.h"#include "stdlib.h"...原创 2018-03-15 23:31:09 · 948 阅读 · 0 评论 -
数据结构系列-线性表的顺序存储及基本操作
程序设计就是对一个确定的问题,选择一个合适的结构来表示,然后通过好的算法去实现,所以说数据结构、算法是很重要的基础。顺序存储的线性表,在查找指定位置元素时非常快,时间复杂度是O(1),但是删除、插入元素时可能要移动元素导致效率变慢,时间复杂度可能是O(n),还有一个问题就是存储空间容量要事先确定的。针对顺序存储的不足,有了链式存储。线性表就是零个或多个数据元素的有限序列。线性表的顺序存储结构--指...原创 2018-03-11 10:39:26 · 459 阅读 · 0 评论 -
求最大连续子序列的和
给出一个序列,求出最大连续子序列的和,并输出最大连续子序列。如:{-10, 1, 2, 3, 4, -5, -23, 100, 3, 7, -21},最大子序列是100,3,7,和是110.public class MaxSubSumDemo { public static void main(String[] args) { System.out.println("求最大子序列的和!")...原创 2018-02-24 19:28:39 · 306 阅读 · 0 评论 -
数据结构系列-线性表的链式存储及基本操作
线性表的链式存储,是用一组任意的单元存储线性表的数据元素,这组单元可以连续,也可以不连续。每个链表元素除了要存储数据信息,还要存储它的后继元素的存储地址,也就是它的数据域、指针域。通常在单链表的第一个结点前附加一个结点,成为头结点,头结点的数据域可以不存储任何信息,也可以存储链表长度等附加信息,头结点的指针域存储的是指向第一个结点的指针。还有一个概念是头指针,指向链表的第一个结点的存储位置,整个链...原创 2018-03-11 21:06:15 · 1227 阅读 · 0 评论 -
数据结构系列-队列的基本操作
队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的端是队尾,允许删除的端是队头。所以说队列是一个先进先出的线性表,相应的也有顺序存储和链式存储两种方式。顺序存储就是用数组实现,比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要移动元素,但是如果删除队头元素,后面的元素就要往前移动,对应的时间复杂度就是O(n),性能...原创 2018-03-19 23:41:27 · 72130 阅读 · 15 评论 -
KMP模式匹配算法
https://www.cnblogs.com/yjiyjige/p/3263858.html很好的解释了,当字符不等时,模式换的j指针,应该怎么指向。http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html阮一峰字符串匹配的KMP算法 转:http://bl...转载 2018-07-19 07:39:36 · 749 阅读 · 0 评论 -
矩阵乘法的计算规则,为什么是A矩阵的行元素分别乘以B矩阵的列元素?
转:https://www.cnblogs.com/alantu2018/p/8528299.htmlMatrix 相关api:https://blog.csdn.net/gb702250823/article/details/53526149https://blog.csdn.net/xiexiangyu92/article/details/79382650https://blo...转载 2019-03-26 14:15:36 · 6702 阅读 · 0 评论 -
数据结构系列 二叉树的遍历(链表存储)
https://www.cnblogs.com/skywang12345/category/508186.html 备忘https://blog.csdn.net/lin20044140410/article/details/103889660二叉树顺序存储二叉树的特点:1,每个结点最多有两棵子树,可以没有或者只有一棵,所以二叉树中不存在度大于2的结点。2,左子树,右子树是...原创 2019-04-21 18:38:48 · 742 阅读 · 0 评论 -
数据结构系列-顺序栈的基本操作
栈(Stack)是限定只能在表尾部进行插入、删除的线性表。也称后进先出的线性表。允许执行插入、删除的那一端成为栈顶,另一端就是栈底,因为只能在栈顶执行操作,所以他是一种特殊的线性表。既然栈是特殊的线性表,也会有顺序存储和链式存储。对于栈的顺序存储,就是用数组来实现,将下标0的一端作为栈底,因为首元素都在栈底,变化最小。顺序栈的数据结构及基本操作:如果需要改变栈的内容,函数的参数类型为指针,否则是普...原创 2018-03-15 22:34:06 · 2352 阅读 · 0 评论 -
链表合并(6)
有两个递增排序的链表,把他们合并后的节点仍然是递增排序的。这个问题的思路比较简单,首先比较p1,p2头结点,把较小的节点(比如是p1)赋值给mergeHead节点,然后,把p1->Next跟p2比较,以此类推,每次比较两个节点,所以这里可以考虑用递归。#include #include "ListCommon.h"using namespace std;ListNode* mer原创 2017-09-03 14:43:06 · 241 阅读 · 0 评论 -
用两个栈实现一个队列算法
栈:后进先出,队列:先进先出。用两个栈实现一个队列,主要实现队列中的两个函数,appendTail,尾部追加,deleteHead,在头部删除节点,用了一个模板类,队列的元素可以是任意类型,int,char都可以,其中类模板中构造函数,析构函数,appendTail,deleteHead的声明和实现都要写在.h中,把实现写在.cpp中,会提示这些方法没定义。模板定义挺特殊的。Analo原创 2017-08-27 12:20:16 · 378 阅读 · 0 评论 -
一个字符替换的算法
给定一个字符串把其中的空格替换成 (%) 这3个字符。#include using namespace std;void strRepace(char chArray[], int maxLen){ if(chArray == NULL) return ;//计算空格数 int numsOfSpace =0;原创 2017-08-26 22:05:52 · 468 阅读 · 0 评论 -
使用位运算 的2个算法
1,不用临时变量,交换两个值:#include using namespace std;void swapValue(int num1,int num2){//通过亦或运算符^,交换两个值,不适用临时变量,第一步:num1 = num1^num2,num2=num2^num1,相当于num2 =num2^num1^num2;也等于num1^num2^num2,因为num2^原创 2017-08-26 11:46:31 · 361 阅读 · 0 评论 -
哈希表,找出第一个出现一次的字符
在一个字符串中,找出第一个出现一次的字符,把每个字符做为hash表中的key,出现的次数做为对应的值。#include using namespace std;char getFirstNotRepeatChar(const char *pStr){ if(pStr == NULL) return '\0';//一个char字符占8个原创 2017-08-24 22:16:10 · 342 阅读 · 0 评论 -
二分法 -算法
二分法查找,这个算法要求数据要是有序的。比如有这样的问题:找出一个数组中,两个数的和小于等于15,然后输出他们,否则就单独输出较大的数。#include using namespace std;void binarySearch(int *array, int length){ if(array == NULL || length == 0) ret原创 2017-08-23 22:49:46 · 541 阅读 · 0 评论 -
字符转整数 算法
把一个字符串转成整数:#include using namespace std;long long strToInt(const char* str){ long long num = 0; bool minus = false; cout if(str != NULL && *str != '\0'){ if(*st原创 2017-08-22 23:00:45 · 325 阅读 · 0 评论 -
反方向打印链表。(2)
给出一个链表的头节点,从尾部逆序打印链表。这里有2中实现思路,一种是用stack,先从头节点开始,依次把链表节点入栈,然后再依次弹出。第二种思路是递归,实际递归的本质也是用栈来实现的。#include #include #include "ListCommon.h"using namespace std;//用stack实现void printListR原创 2017-08-28 22:56:12 · 310 阅读 · 0 评论 -
用O(1)时间,删除一个链表节点(3)
有这样一个问题,给定一个单向链表的头结点pHead和要删除的节点pDeleted,但是要求在O(1)时间完成。可能先想到的就是从头结点往前遍历,找到要删除的节点pDeleted,这样就知道了它的前后节点,但是这样的时间是O(n)。这里的思路是:把pDeleted的下一个节点pNode1的值赋给pDeleted,同时让pDeleted指向pNode2,然后把pNode1删掉,pDelet原创 2017-08-31 22:52:32 · 347 阅读 · 0 评论 -
环形链表,约瑟夫问题,(7)
一个经典的环形链表问题,有1,2,3,,,,n这些数字排成一个圆圈,从1开始每次删除第m个数字,求出这个圆圈中最后的数字。当然也可以说先从数字k开始,数到m删除这个数字,然后就从1开始,数到m删除这个数字,原理是一样。这里是从1开始,数到m删除这个数字。其实一个单向非循环链表也是可以模拟这个应用的,就是当指针知道最后一个节点时,让他转到头结点继续遍历。下面的实例是环形链表,尾节点的下一原创 2017-09-04 22:36:31 · 339 阅读 · 0 评论 -
字符串排列,for循环嵌套递归
字符串的排列,就是给定一个字符串abc,输出能排列出的所有的字符串,如:abc,acb,bac,bca,cba,cab,写这个算法主要是想练习for循环中嵌套递归是怎么执行的,其实单纯的递归算法还是相对好理解的,你想找一个问题的递归算法,就是先把问题分成更小的子问题,并且这个分割还要是有限的,得有终止递归的条件,然后就是用什么方法解决最小的问题。算法写出来后,验证算法的正确行,运行下最直观,也原创 2017-09-10 22:55:23 · 1403 阅读 · 0 评论 -
从尾部查找一个单向链表的第几个节点。(4)
给定一个单向链表,查找出从尾部开始的第k个节点,也就是倒数第k个节点,这里假定是从1开始计数的,即尾节点是第一个节点。如图,假如要查找的是倒数第3个节点,一种思路就是从头结点开始遍历,遍历到尾部,得出链表的长度n,然后再从头开始遍历到 n-k+1个节点,就是倒数第k个,这么做要遍历链表两次。还有一个思路,定义两个指针,p1st,p2d,开始都指向头结点,如果p1st指向尾部节点时,刚好原创 2017-09-02 21:42:52 · 891 阅读 · 1 评论 -
反转链表,(5)
实现链表的反转,比如原来是 1->2->3->4->5;翻转后就是 5->4->3->2->1,原创 2017-09-03 12:49:11 · 197 阅读 · 0 评论 -
链表基本操作的函数实现。(1)
如下是一个模拟的链表的基本操作,主要有创建链表,连接链表,打印链表,删除链表等,后面有关链表的算法都依赖这个文件中函数实现。ListCommon.h//链表的结构struct ListNode{ int m_nValue; ListNode* m_pNext;};//通用的操作函数ListNode* CreateListNode(int原创 2017-08-28 22:48:22 · 927 阅读 · 1 评论