数据结构
文章平均质量分 85
ShawnLeex
坚持做自己懒得做但是正确的事情,你就能得到别人想得到却得不到的东西。
展开
-
C语言实现顺序表
顺序表是C语言中一种基本的结构,可以存储各种基本类型的数据,而且不但可以存储基本类型的数据,也可以存储一种结构。所以顺序表是一种在学C的过程中必须掌握的结构,通过学习整理,下面来实现一下: 首先,先要想好用什么实现,一般实现最基本的顺序表的话直接用数组实现,我们在这用一个结构体来封装这个顺序表(封装这一概念是在C++中最常用的概念)#define ARRAY_EMPTY -2#define A原创 2016-05-24 15:27:29 · 706 阅读 · 0 评论 -
各种排序算法大汇总
比较排序是比较常见的排序算法,它分为以下几个类:交换排序:冒泡排序(BubbleSort)和快速排序(QuickSort)。插入排序:直接插入排序和希尔排序(ShellSort)。选择排序:选择排序(SelectSort)和堆排序(HeapSort)。(一)交换排序:void BubbleSort(int* arry, int size){ for (int i = 0; i < size -原创 2016-05-24 15:28:42 · 568 阅读 · 0 评论 -
哈夫曼树实现文件压缩与解压缩
见识了360压缩的神奇后,想要实现自己的文件压缩程序,然后花了近一个星期的时间去完成文件压缩与解压缩,期间有很多坑,花了很长时间去调试它,最后把坑给填了(真心的感受到了程序员写代码时的小小粗心会把自己给坑惨)。以下是些程序时的一些坑:在windows下回车的字符是‘\r’'\n',编译器在读取字符时读取到'\r'后再读取到'\n'就会转换为回车。。。在解压缩小文件时不会出现的问题在解压原创 2016-06-06 21:23:14 · 24470 阅读 · 15 评论 -
数据结构之红黑树
一直觉得数据结构中最难以搞懂的结构之一就是红黑树了。所以一开始就对红黑树有一股“敬畏感”,所以在学习红黑树的时候在网上查找了很多资料。但是网上的资料在讲解时条理不清,有的只是点甚至一笔带过,树的变化也没有体现出来。自己总结了好久才把它给搞定,再此,向大家分享一下个人的思路。 首先,我们要知道红黑树的规则: 性质1. 节点是红色或黑色。 性质2. 根是黑色。原创 2016-06-14 19:42:48 · 473 阅读 · 0 评论 -
平衡搜索树之AVLTree
今天我想要在这里写下个人觉得比较难的数据结构---AVL树的一些些心得。一。了解一种新的数据结构,首先要搞懂它的定义:AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。所以严格点来说,对于一棵搜索二叉树,能达到O(logn)的只是原创 2016-07-23 21:21:13 · 1361 阅读 · 0 评论 -
STL-迭代器源码剖析
在接触了STL后,觉得STL就是一个为效率而生的怪物,而且令人惊讶的是它里面的很多算法和模板对于学C++的人来说是非常有价值去剖析的。 迭代器(Iterator)模式--提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂(iterator)将它们撮合在一原创 2016-07-11 21:11:19 · 2139 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:找出数组中的根节点,将数组分为左右子树,递归判断是否满足二叉搜索树的性质:左子树都比自己小。右子树都比自己大。如果按照后序遍历,先左后右最后根的顺序来遍历树,数组的最后一个元素肯定是自己(父节点)然后剩余的部分分成原创 2016-07-06 23:11:40 · 367 阅读 · 0 评论 -
比KMP高效的Boyer-Moore字符串匹配算法
在这里我所要想说的比KMP算法高效的算法是Boyer-Moore算法。 在讲解Boyer-moore算法之前,在这里先回顾一下KMP算法。 比如说有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"。大部分情况下我们会使用KMP算法去解:原创 2016-07-07 20:15:54 · 3475 阅读 · 4 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现超过数组长度的一半,请找出这个数字。列入输入一个长度为9的数组{1,2,3,2,2,2,5,4,2},由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 看到题目的第一感觉就是要先把未排序的数组排序,排序的最小时间复杂度(快速排序) O(N*logN) , 加上遍历,时间复杂度为: O(N*logN+N) 第二种方法是考虑每次删除两个原创 2016-06-22 17:48:12 · 314 阅读 · 0 评论 -
数据结构之二叉搜索树(BinarySearchTree)
一。定义:二叉搜索树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 任意节点的左原创 2016-06-03 08:32:14 · 653 阅读 · 0 评论 -
模拟实现英汉字典(使用key/value形式的哈希表)
上一篇博客我们实现了key形式的线性探测法处理哈希冲突,有了前面的基础,我们就可以实现更加有难度的key/value形式的二次探测。 什么是key/value形式呢? key/value形式就是在哈希表中,有一个决定数据在表中位置的关键字key和这个关键字所携带的值value。 在这里我们的目标是实现一个英汉字典,一个英语字符串就是key,对应的有一个汉语翻译value,通过key我们可以找原创 2016-05-24 15:28:27 · 749 阅读 · 0 评论 -
位图
位图算法是一种使用二进制位来表示一个数是否存在的算法。 一个字节是八位二进制,可以表示两种状态,1和0。1表示存在,0表示不存在。 四个字节是32位二进制,可以表示32种状态。 八个字节是64位二进制,可以表示64种状态。 比如这道题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】 这是一道腾讯的编程题,看起来也是难难的。原创 2016-05-24 15:28:36 · 307 阅读 · 0 评论 -
使用两个队列实现一个栈
首先,我们得了解队列和栈的基本原理。 队列是一个“先进先出“的一个结构。队列的定义是在队尾插入,在队头删除,这就要求要用一种在尾部插入容易的,在头部删除容易的结构,你一定会想到单链表,对,库的实现就是用一个链表实现的。 栈,相信大家都不会陌生,函数栈帧等的实现,它是一种”先进后出“的结构。栈的插入删除都是在尾部进行的。 所以要用队列实现一个栈,要解决的问题就是在删除时要删除最后插入的那个元素原创 2016-05-24 15:27:32 · 1290 阅读 · 0 评论 -
数据结构之堆(Heap)的实现
堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆。二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于 任何一个子节点的键值时为最小堆。 最大堆和最小堆是堆数据结构的原创 2016-05-24 15:28:10 · 7078 阅读 · 0 评论 -
找出N个数据中的最大的K个数据---堆排序
从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据。这就让我们打消了用排序的方法来解的念头。 在这里我们使用堆排序来完成。 650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7F/8C/wKiom1ch-hHjqORSAAAWpw4wnkw367.png" title="捕获4原创 2016-05-24 15:28:12 · 5718 阅读 · 0 评论 -
优先级队列
优先级队列首先是一个队列,但是它强调的是“优先”,所以优先级队列又分为最大优先队列和最小优先队列。 最大优先级队列:每次从队列中取出优先级最大的数据,删除数据也是删除优先级最大的数据。 最小优先级队列:每次从队列中取出优先级最小的数据,删除也是删除优先级最小的数据。 所以我们用一个类去实现优先级队列时就需要用到小顶堆和大顶堆的概念。我们并不关心除了最高优先级和最低优先级的数据在队列中是怎体存储的原创 2016-05-24 15:28:15 · 437 阅读 · 0 评论 -
斐波那契数列的最优算法(O(logN))
相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码://递归实现long long fib(int n){ if (n =1 || n== 2) { return 1; } return (fib(n - 2) + fib(n - 1));}或者是这样的时间复杂度为O(N),空间复杂度为O(1)://优化一:时间复杂度为O(N)lon原创 2016-05-24 15:28:18 · 16201 阅读 · 2 评论 -
处理哈希冲突的线性探测法
哈希表,是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。(摘自维基百科) 对不同的关键字可能得到同一散列地址,即k1!=k2,而f(k1)=f(k2),这种现象称为碰撞(英语:Collision),也叫哈希冲突。 处理哈原创 2016-05-24 15:28:24 · 19631 阅读 · 1 评论 -
布隆过滤器(Bloom Filter)
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合原创 2016-05-24 15:28:39 · 355 阅读 · 0 评论 -
实现哈希桶(空间利用率较高的哈希表)
前面几篇博客已经写过了哈希表的闭散列法,也写过哈希表的应用,在这里就不赘述。今天我们要实现的是一个哈希桶。什么哈希桶呢?哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),在这里我们可以把每个key的位置看作是一个孔,孔里放了一个链表相信大家可以看出来,使用一个数组来存放记录方法的哈希冲突太多,基于载荷因子的束缚,空间利用率不高,在需要节省空间的情况下,我们可以用哈希桶来处理哈希冲突。哈希桶原创 2016-05-24 15:28:30 · 11498 阅读 · 1 评论 -
一致性哈希算法
原来对于一致性哈希是一种半知半解的状态,今天刷掘金时刚好发现发现一片特别好的一致性哈希算法文章,在此给大家分享:本文copy至http://coderroc.com/article/%E7%9F%A5%E8%AF%86%E8%AE%B0%E5%BD%95/Consistent-Hashing.html一致性Hash算法是什么?一致性哈希(Consistent Hashing转载 2016-07-30 13:19:04 · 703 阅读 · 0 评论