![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Data Structure and Algorithm
文章平均质量分 92
winwonnn
这个作者很懒,什么都没留下…
展开
-
写给自己看的B树(1):新建、插入、遍历&清除
参考:算法导论B树(B-tree),其实算是二叉查找树的一种扩展。在二叉查找树中,一个非叶子节点可以有1个key+2个children(左、右),而B树,则可以有n个key+(n+1)个children,对于其中的某个key,其左子树 <= key,其右子树 >= key。在《算法导论》中,采用了最小度数t对B树进行定义,其中比较关键的是:a.除根结点外的每个结点必须至少有t-1个key。因此,除了根结点以外的每个内部结点必须至少有t个children。如果树非空,根结点至少有1个key原创 2020-07-26 23:34:58 · 226 阅读 · 0 评论 -
写给自己看的DBSCAN(1):基本实现
参考:西瓜书DBSCAN的思想是基于密度来聚类,十分直观易懂,更严谨的描述可见西瓜书,其中个人认为最关键的是:若xxx为核心对象,由xxx密度可达的所有样本组成的集合记为X={x′∈D∣x′由x密度可达}X=\{x' \in D \mid x'由x密度可达\}X={x′∈D∣x′由x密度可达},则不难证明XXX即为满足连接性与最大性的簇。这就指明了实现的一种思路:先找到所有的核心对象,再找到这些核心对象密度可达的其他点。伪代码如下:这里给出C++的实现,基本上忠于上述的伪代码,没有对性能进行原创 2020-07-15 23:40:44 · 279 阅读 · 0 评论 -
写给自己看的二叉查找树(1):基本操作
1.定义二叉树的每个节点有一个数据成员和两个指针,两个指针分别指向左、右子树。typedef int eletype;typedef struct node{ eletype data; struct node *lchild; struct node *rchild;}Tnode;2.创建一个只含有根节点的空二叉树注意要将根节点的左、右子树初始化为NULL。Tnode ...原创 2019-03-19 20:56:56 · 128 阅读 · 0 评论 -
写给自己看的单链表(4):快速排序
!!!Attention:以下操作中的单链表均带有头结点!!!参考了这三篇文章:单链表快速排序算法的实现单链表的快速排序单链表的快排实现快速排序的思路是:首先,选取一个pivot;然后以pivot作为基准,对待排序的数据进行分区,得到两个部分,一个部分的数据均小于pivot,另一个部分的数据均大于pivot,然后对这两个部分再进行之前的操作,直至排序完成。对数组来说,pivot通常会选...原创 2019-03-20 15:29:58 · 139 阅读 · 0 评论 -
写给自己看的单链表(5):归并排序
!!!Attention:以下操作中的单链表均带有头结点!!!原创 2019-03-21 12:44:22 · 303 阅读 · 4 评论 -
写给自己看的散列表(1):分离链接法
1.定义分离链接法实际上是通过在散列表的某个位置上用单链表存储一串数据(这些数据通过散列函数得到的地址相同)来解决冲突的问题,所以在散列表的结构中需要有一个数组(也可以说是指针)pLnode *pList去存储这些链表的“表头”节点。而在链表数据结构中,节点实际上是一个“链表结构”类型的指针(比如在之前单链表的代码中头结点的定义就是Lnode *head),这个指针指向一片内存,这片内存里存储了...原创 2019-03-26 21:21:57 · 296 阅读 · 0 评论 -
写给自己看的散列表(2):开放定址法
1.定义在开放定址法中,用一个数组来存储散列表的元素,因此散列表结构Htable中有一个数组(指针)CellArray,数组中的每一个元素都是一个Hcell,Hcell中除了有data外,还有一个enum类型的字段来记录该元素的“状态”,为空、被使用或者已删除。enum entrykind {Legitimate, Empty, Deleted};typedef struct cell{...原创 2019-03-28 15:58:22 · 405 阅读 · 0 评论 -
写给自己看的栈(1):基本操作
1.定义用单链表来实现的栈,定义也就跟单链表一样了,有一个数据成员和一个指针成员。typedef int eletype;typedef struct node{ eletype data; struct node *next;}Stack;2.新建栈完成的操作就是分配空间,注意指针指向结尾NULL。Stack *CreateStack(){ Stack *S; ...原创 2019-05-03 15:52:16 · 133 阅读 · 0 评论 -
写给自己看的队列(1):基本操作
准确地说这是一个循环队列。参考如何使用C语言写: Generic Queue1.定义重点是front和rear,front和rear的指向要看程序猿的习惯,具体代码具体分析。做法1:front指向队首元素的前一个位置,rear指向队尾元素,不利用size来记录队列中的元素个数,这样使得当队列满时,数组array中其实还有一个空的位置。不应该出现front=rear的情况,否则无法区分空队...原创 2019-05-03 16:26:35 · 134 阅读 · 0 评论 -
写给自己看的二叉堆(1):基本操作
也就是一棵完全二叉树。堆顶最大则为大根堆,堆顶最小则为小根堆,这里实现的是小根堆。1.定义用一个数组来存储数据。typedef int eletype;typedef struct heapstruct{ int capacity; int size; eletype *arr; //used for saving data}Heap;2.新建一个二叉堆给二叉堆分配空间,...原创 2019-05-19 16:21:27 · 140 阅读 · 0 评论 -
写给自己看的单链表(3):冒泡排序和插入排序
!!!Attention:以下操作中的单链表均带有头结点!!!1.冒泡排序首先要获取单链表的长度n。冒泡排序的基本思路是:从某一方向开始,依次两两比较,把小的放左边,大的放右边。由于单链表的单向性,这里的“冒泡”并不是将更小的元素移到更前的位置,而是反过来,将更大的元素移到更后的位置。程序的主体由两个嵌套的循环构成,外部循环要进行n-1次,内部的循环用于进行相邻元素之间的两两比较。经过第一次...原创 2019-03-19 19:00:23 · 205 阅读 · 0 评论 -
写给自己看的单链表(2):进阶操作
!!!Attention:以下操作中的单链表均带有头结点!!!1.反转方法有好几种,可以参考看图理解单链表的反转,这里采用3个指针prev、current和s遍历单链表,逐个节点进行反转的方法。当节点数为0或1时没有必要进行反转,所以首先要进行判断。最后要注意把head指针指向正确的节点。void ReverseList(Lnode *head){ if (head == NULL ||...原创 2019-03-19 17:12:42 · 172 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.5笔记
1.散列函数 Hash function:如何把元素分配到散列表中?insteresting:秦九韶算法(Horner’s rule)2.要插入的元素所对应的位置不是空的怎么办:分离链接 Separate chaining、开放定址 Open addressing、再散列 Rehashing、可扩散列 Extendible hashing。3.分离链接:在位置上加入链表。λ\lambdaλ...原创 2019-02-15 15:45:37 · 128 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.6笔记
1.优先队列,至少允许两种操作:插入Insert和删除最小值DeleteMin。2.实现方法:链表,二叉堆 binary heap。3.二叉堆结构性质:完全二叉树。堆序性质:最小元总可以在根处找到。基本操作:插入(上滤策略 percolate up),删除最小元(下滤策略 percolate down),降低关键字的值,增加关键字的值,删除,构建堆。4.应用:堆排序,事件模拟。5.d...原创 2019-02-16 23:37:23 · 129 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.7笔记
1.插入排序Run time O(n^2))2.希尔排序(最小增量排序)希尔增量序列 2/N。Hibbard增量序列 (2^k)-1。3.堆排序4.归并排序5.快速排序如何选取枢纽元pivot?6.桶排序7.外部排序(待看)...原创 2019-02-17 18:12:36 · 130 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.8笔记
1.等价关系:自反性,对程序,传递性。2.两种运算:Find和Union。3.用树来表示的结构。4.按大小求并,按高度求并。5.路径压缩(再看)。原创 2019-02-18 11:18:29 · 91 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.1&2 笔记
Chapt.11.原创 2019-02-12 16:20:09 · 203 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.9笔记
1.拓扑排序找出任意一个没有入边的顶点,删除该顶点和它的边。2.无权最短路径,广度优先搜索3.Dijkstra算法9.3.3-9.4待看4.Prim算法5.Kruskal算法6.如何删除割点?(9.6.3双连通性)7.欧拉回路,interesting。9.6.5-9.7待看...原创 2019-02-18 17:16:11 · 142 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.3笔记
1.表 List ADT链表的数组表示法。链表Linked List,双向链表Doubly Linked List,循环链表Circularly Linked List。表的声明(头文件)。函数:判断是否为空表IsEmpty(),判断是否为表的结尾IsLast(),查找Find()和FindPrevious(),删除Delete(),插入Insert(),删除表DeleteList()。...原创 2019-02-14 10:51:21 · 115 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.10笔记
5大算法:贪婪 Greedy,分治 Divide and conquer,动态规划 Dynamic Programming,随机 Randomized,回溯 Backtracking。每一个小节都是一个具体的问题,应当仔细看,待看的:10.2.2-4,10.3,10.4.3,10.5.2。...原创 2019-02-19 17:06:32 · 129 阅读 · 0 评论 -
写给自己看的单链表(1):基本操作
1.定义定义一个eletype,便于更改元素的类型。node结构体有两个成员,一个是数据成员,一个是指向下一个节点的指针成员。给node结构体起个别名Lnode,这样就可以直接定义Lnode型变量,无需用struct node这么长的名字。typedef int eletype;typedef struct node{ eletype data; struct node *next;...原创 2019-03-10 20:03:38 · 163 阅读 · 0 评论 -
《Data Structure & Algorithm Analysis in C》Chap.4笔记
1.树的遍历:前序遍历、中序遍历和后序遍历。应用:表达式树。2.二叉查找树声明。函数:新建MakeEmpty(),查找Find(),FindMin(),FindMax(),插入Insert(),删除Delete()。3.AVL树单旋转和双旋转。4.伸展树Splay TreeSplaying: Zig-zag和Zig-zig两种情况。5.B树(NOT binary)如何插入元素。...原创 2019-02-14 16:09:19 · 176 阅读 · 0 评论