数据结构
g33_N
这个作者很懒,什么都没留下…
展开
-
哈夫曼树实现文件的压缩与解压缩
利用哈夫曼树实现文件的压缩与解压缩 压缩: 1、统计出文件中相同字符出现的次数 2、获取哈夫曼编码 次数作为权值构建哈夫曼树 3、重新编码,写回压缩文件 保存头文件: 源文件后缀 编码信息的行数 每个字符的权原创 2017-03-08 19:16:08 · 11928 阅读 · 7 评论 -
求一个无序数组的中位数
求一个无序数组的中位数,如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能低。 解决方案一:采用堆排序思想 1、将前(n+1)/2个元素调整为一个小顶堆 2、对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素原创 2017-08-05 14:34:09 · 1721 阅读 · 1 评论 -
int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)
int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 根据时间复杂度要求,可以用鸽巢排序。所谓鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用. 算法分析:原创 2017-08-05 10:25:25 · 1330 阅读 · 0 评论 -
归并排序算法(递归与非递归)
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 归并排序属于外部排序,无最好最差情况,不跨区间排序是一种稳定的排序算法。 时间复杂度:O(n log n) 空间复杂度:O(n) 基本思路: 设两个有序原创 2017-08-04 15:00:25 · 1186 阅读 · 0 评论 -
快速排序经典算法(分治法,挖坑法,前后指针法,非递归)
快速排序最优的情况就是当关键值位于序列中间时 快速排序最坏的情况就是对已序的序列进行排序 时间复杂度:O(N^2)最差 使用场景:数据量大而杂乱的序列,避免出现最坏的情况 快速排序递归算法之分治法 基本思路: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。原创 2017-08-04 14:36:42 · 2574 阅读 · 1 评论 -
位图的实现以及应用
所谓位图就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。 32位机器上,一个整形,比如int a;在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询 优点:效率高,不许进行比较和移位,占用内存少,比如N=10000000;只需占用内存原创 2017-08-07 21:16:25 · 1637 阅读 · 0 评论 -
实现布隆过滤器
结合了位图和Hash表两者的优点,位图的优点是节省空间,但是只能处理整型值一类的问题,无法处理字符串一类的问题,而Hash表却恰巧解决了位图无法解决的问题,然而Hash太浪费空间。针对这个问题,布隆提出了一种基于二进制向量和一系列随机函数的数据结构-布隆过滤器。它的空间利用率和时间效率是很多算法无法企及的,但是它也有一些缺点,就是会有一定的误判率并且不支持删除操作。 实现代码:#include"c原创 2017-08-07 21:29:01 · 852 阅读 · 0 评论 -
选择排序&&堆排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 排序思想: 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用原创 2017-07-31 22:05:18 · 458 阅读 · 0 评论 -
插入排序&&希尔排序
插入排序:在一个已经排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入已经排好序的子集中,直到将所有待排纪录全部插入为止。例如打扑克牌时的抓拍就是插入排序的一个很好的例子,每抓一张牌,插入到合适位置,主导抓完牌为止,即可得到一个有序序列。 适合场景:记录个数少而接近有序的序列 时间复杂度:O(N^2)—最差情况(完全无序) O(N)——最优情原创 2017-07-30 14:53:23 · 508 阅读 · 0 评论 -
将二叉搜索树转换成一个排序的双向链表--中序线索化的变型。
将二叉搜索树转换成一个排序的双向链表。 注意:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。 在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链原创 2017-07-29 16:43:29 · 651 阅读 · 2 评论 -
将N个字符的数组,循环右移K位。时间复杂度O(N)
将N个字符的数组,循环右移K位。时间复杂度O(N) 比如:str[]=”abcde123”,右移3位 1、旋转abcde->edcba 2、旋转123->321 3、整体旋转abcde123->123abcdevoid reverse(char *str, int left, int right){ while (left<right) { char tmp原创 2017-08-05 15:43:23 · 1205 阅读 · 0 评论