数据结构&算法
数据结构和算法的记录
lkness
学不见其长,但日有所增
展开
-
skiplist跳表
学习了下跳表的逻辑代码。固定层级跳表,对动态链表长度不灵活,考虑根据链表长度来扩充层级。原创 2023-03-29 09:33:18 · 69 阅读 · 0 评论 -
图的简单表示-算法学习笔记十七
基于邻接矩阵和邻接链表的图表示法,以及各自的深度优先遍历和广度优先遍历,但图的表示中没有加带权的边,只是简单写一写,学习一下,底层链表和队列用了通用链表#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#define PRINT(format, arg...) \do{ \ print原创 2017-05-06 11:17:27 · 313 阅读 · 0 评论 -
trie树-《算法导论》学习笔记十四
引用一下百度百科的话吧: Trie树,又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。这里构建了一棵字典树,每个结点有52个孩子指针,对应26个小写字母和26个大写字母,根节点不存储数据,一个原创 2017-04-23 22:18:15 · 1782 阅读 · 0 评论 -
avl树-《算法导论》学习笔记十三
(引用算法导论)AVL树是一种高度平衡的二叉搜索树:对每一个结点x,y的左子树与右子树的高度至多为1。AVL树相比二叉搜索树,每个结点维护一个额外的属性:结点的高度。AVL树实现了几个操作:树结点创建遍历 递归的前序、中序、后序遍历,以及基于层序遍历的简单图形打印 后序遍历释放树结点搜索寻找结点子树最小关键字结点、寻找结点子树最大关键字结点求结点高度左旋右旋插入 先以普通二原创 2017-04-20 22:41:10 · 698 阅读 · 1 评论 -
通用链表/栈/队列-算法学习笔记十六
今天准备学习数据结构图,会用到栈和队列,因此写了下代码,底层用了通用链表,为循环双向结构,结点数据域为void *;通用链表层之上封装了栈和队列,比较简单,但是代码行数有点多,单独摘出:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <time.h>#define MAX_原创 2017-04-30 22:08:50 · 528 阅读 · 0 评论 -
外排序多路归并+败者树-算法学习笔记十五
问题:一个文件有大量的数,现要对文件排序,但内存无法一次读取完全,而磁盘空间足够,要如何排序。学习了几篇博客: 1. july大神的海量数据排序(他的其他博客都很值得看) 2. 对july大神的算法进行改进不用选择法而是败者树的博客 3. 以及另一篇但不知道是否为原创的博客 4. 还有生成不重复乱序m-n的数的博客(先生成m-n的数,然后洗牌算法)以上几篇博客写得很完全了,看懂了思路原创 2017-04-28 00:06:56 · 1673 阅读 · 1 评论 -
桶排序-《算法导论》学习笔记九
桶排序要求数据均匀、独立分布在某个区间上,然后将待排序值按某个区间划分为几个区间数组,然后将待排序的数按这个区间划分公式有序放入对应桶中,这样放完之后再按顺序从桶中拿出来一个一个放入原数组。 c代码桶可以用链表,如待排序数组的值为0-99,那么桶可以划分为0-9、10-19、20-29…..,这样就得到了10个桶数组链表,然后遍历待排序的数组,将值/10后以链表插入排序方式放入对应桶链表中(就像打原创 2017-04-04 19:36:25 · 663 阅读 · 0 评论 -
计数排序-《算法导论》学习笔记八
计数排序:假设n个输入元素中的每一个都是在0-k区间内的一个整数(k为正整数),对每一个输入元素x,确定小于x的元素个数,用一个0-k长度的数组做记录,例如输入数组的数为0-10长度,随机出[2,5,3,0,2,3,0,3],可以计算出一个0-10的数组,分别表示小于等于x的数的个数,于是有:0->2,1->2,2->4,3->7,4->7,5->8,6->8,7->8,9->8,10->8,然后再原创 2017-04-04 19:27:38 · 218 阅读 · 0 评论 -
红黑树-《算法导论》学习笔记十二
红黑树是一种二叉搜索树,它在每个结点上增加了一个存储为来表示结点的颜色,或红或黑,通过从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其它路径长出2倍,近似平衡的。树种每个结点包含5个属性:color、key、left、right、parent,如果一个结点没有子结点或父结点,则该结点相应指针属性值指向空(这里的空不是空指针,而是定义一个空结点,结点颜色为黑色),一颗红黑树是原创 2017-04-13 00:10:19 · 341 阅读 · 0 评论 -
快速排序-《算法导论》学习笔记七
快排利用分治的思想,将问题规模切分为小的子规模问题,类似归并排序,归并是将两个待排序的子数组合并为一个有序的数组,而快排是将数组以某个数组值划分为两个子数组,一个数组的所有数比这个值小,一个数组的所有数比这个值大,然后再递归地对两个子数组再以某个数组值做切分和交换:#include <stdio.h>#include <string.h>#include <unistd.h>#include原创 2017-03-31 19:40:58 · 321 阅读 · 0 评论 -
二叉搜索树-《算法导论》学习笔记十一
二叉搜索树是以一颗二叉树来组织的,每个节点除数据外,还包括三个分别指向父结点、左孩子、右孩子的指针,二叉搜索树有个特性:某个结点root的左子树的某个节点x的关键值小于等于root结点右子树某个结点y的关键值。二叉搜索树有几个操作: 1、查找 查找与给定关键值相等的结点 2、遍历 前序、中序、后序遍历输出 3、从某结点出发,寻找子树中最小关键值的结点 4、从某结点出发原创 2017-04-09 10:05:17 · 318 阅读 · 0 评论 -
查找数组第i小的数-《算法导论》学习笔记十
查找第i小的数利用了快速排序的一点思想,即以数组某个值作为比较值,然后遍历数组中除这个数以外的数,小于它的就放左边,大于它的放右边,然后作为比较值的数放中间,并返回比较值的下标,如果下标等于i,表示就找到了,如果下标大于i,又再次从大于此下标的数组递归进行此过程,同理,小于i就从小于此下标的数组递归进行此过程,代码:#include <stdio.h>#include <stdlib.h>int原创 2017-04-09 09:31:34 · 749 阅读 · 0 评论 -
堆排序-《算法导论》学习笔记六
堆排序就是将一组数按二叉树层序遍历的存储顺序,经过一系列比较转移,最终变成有序的数组,这里的二叉树堆一定是完全二叉树。堆排序能进行的基础是有个最大堆的数组,最大堆性质是指树上的每个节点的子节点都比自己小或等于。 因此最顶上的根节点一定是值最大的节点,有了最大堆在,堆排序就可以进行了,从层序遍历的最后一个节点开始倒序循环,交换当前节点与最顶层根节点,即最大值的节点,这样每次最大的节点都被放在层序遍历原创 2017-03-19 22:00:11 · 398 阅读 · 0 评论 -
n阶矩阵一般乘法-《算法导论》学习笔记五
A、B两个矩阵均是nxn的矩阵,则两个矩阵的乘法: 一般的矩阵乘法代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <time.h>class SquareMatrix {public: SquareMatrix(){} SquareMatrix原创 2017-03-19 18:29:56 · 6560 阅读 · 0 评论 -
分治之最大子数组-《算法导论》学习笔记四
《算法导论》第4章4.1使用分治策略求最大子数组(数组包含负数,不然整个数组即使最大子数组,求解没意义)。思路:数组头为low,尾为high,mid=(low+high)/2,这样将数组分为了两段。首先肯定存在这个最大子数组。那么子数组的位置要么处于mid左边,要么处于mid右边,要么包含mid。假设最大子数组出现在mid左边,对mid左边子数组再进行(low+high)/2切分,那么最大子数组可能原创 2016-11-19 17:14:29 · 362 阅读 · 0 评论 -
归并排序-《算法导论》学习笔记二
算法导论第二章3小节讲到分治法,即将大问题化解为规模小一些的同类问题,这样先处理小问题,再合并两个小问题再解决,递归的思路。按照书上的伪代码,写了c算法。#include <stdio.h>#include <time.h>#include <stdlib.h>void merge( int *arr, int p, int q, int r ){ int arrlen = r原创 2016-09-08 21:00:59 · 402 阅读 · 0 评论 -
插入排序-《算法导论》学习笔记一
算法导论第二章的第一小节是插入排序,也就是像打扑克牌整理扑克一样,从左边第二张开始,每张与前边排好序的扑克牌比较,比较到能插入的位置就插入,算法比较简单。#include <stdio.h>#include <unistd.h>#include <time.h>#include <string.h>#include <stdlib.h>void insert_sort0( int* arr,原创 2016-09-08 20:50:09 · 365 阅读 · 2 评论 -
递归插入排序-《算法导论》学习笔记三
算法导论第二章结尾练习2.3-4提到将插入排序写递归版本,然后尝试写了个,本来写了就好了,但是调试的时候排序10w个数可以,排序100w个数就段错误,分析了一下,把结果放上来以后查看,先贴代码:#include <stdio.h>#include <unistd.h>#include <time.h>#include <string.h>#include <stdlib.h>void ins原创 2016-09-18 14:07:33 · 937 阅读 · 0 评论