数据结构
文章平均质量分 80
CTTCassie
玩转C/C++,初始linux
展开
-
模拟实现线性表-顺序存储方式
永远不要否定自己,因为你不知道自己会有多大的潜力。原创 2016-05-24 22:41:41 · 1594 阅读 · 2 评论 -
栈&队列面试题之实现一个栈...(Push,Pop,Min)
实现一个栈,要求实现Push(压栈),Pop(出栈),Min(返回最小值的操作)的时间复杂度为O(1) 我们知道栈是后进先出的一种数据结构,这种数据结构只允许在栈顶进行插入删除,所以要实现栈这种数据结构最好的结构就是顺序表.当尾插尾删多的时候,链表存在开辟空间和删除空间的时间消耗所以此时顺序表优于链表.结构选好之后就是如何求出栈的元素的最小值了? 思路一:原创 2016-09-10 12:53:43 · 3422 阅读 · 0 评论 -
数据结构之搜索二叉树递归&非递归
每天都进步一点你会发现这个世界真的不一样原创 2016-10-18 21:31:21 · 2789 阅读 · 0 评论 -
数据结构之二叉树的递归实现
二叉树的概念篇> (1).二叉树是一颗特殊的树,二叉树每个结点最多有两个孩子结点,即就是左孩子和右孩子 (2).满二叉树:若一颗树的高度为h,则h层均满 (3).完全二叉树:若一棵树的高度为h,则前h-1层均满最后一层可以不满,且最后一层的结点都连续集中在最左边. 我们知道一个数组可以表示一颗树,它的思想是如果该处有结点则直接将该结点放在对应的下标处,如果没有结点则以符号占位原创 2016-09-25 17:08:41 · 1177 阅读 · 0 评论 -
数据结构之大小堆&&优先级队列
大小堆>一.什仫是堆? 堆这种数据结构说白了就是一颗完全二叉树,堆的含义说明这颗完全二叉树中的所有非终端结点的值均不大于(或不小于)其左,右孩子结点的值.若一维数组{k1,k2,k3,k4...kn}是堆,则堆顶元素必为序列中n个元素的最小值(或最大值) 最大堆:每个父结点的值都大于其孩子结点. 最小堆:每个父结点的值都小于其孩子结点.二.如何利用一维数原创 2016-10-11 19:34:10 · 1278 阅读 · 0 评论 -
数据结构之二叉树的非递归实现
非递归实现二叉树的前序,中序以及后序遍历. 在非递归实现二叉树的前序,中序以及后序遍历时用到了栈这种数据结构. 一.非递归实现前序遍历. 我们知道二叉树的前序遍历是先访问根结点,然后访问左子树,最后再访问右子树.那仫如何非递归去前序遍历一颗树呢? 二 .非递归实现中序遍历. 非递归的中序遍历类似前序遍历只不过将访问当前结点原创 2016-09-27 15:24:06 · 1907 阅读 · 0 评论 -
Huffman的应用之文件压缩与解压缩
文件压缩与解压缩> 最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,下面开始介绍思路... 1).统计>读取一个文件统计这个文件中字符出现的次数.原创 2016-10-30 12:02:28 · 4618 阅读 · 0 评论 -
排序算法之堆排序
堆排序> 在上一篇中提到了大小堆的问题,大小堆的一个应用就是堆排序,那仫什仫是堆排序呢?相对于我们经常使用的冒泡,选择以及直接插入排序,堆排序又存在什仫样不同的地方?我就从这几个问题开始着手解决堆排序的问题. 堆排序顾名思义就是利用堆(假设利用小堆)进行排序的方法,它的基本思想是:先将待排序的序列构成一个小堆,在这个时候堆顶结点就是整个系列的最小值;然后将堆顶元素与堆数组末尾的原创 2016-10-12 10:03:24 · 519 阅读 · 0 评论 -
AVL树
就算野生野长,也要开出最美丽的花。。。原创 2016-10-25 16:21:53 · 981 阅读 · 1 评论 -
位图的应用之海量数据查找
位图> 一.什仫是位图> 顾名思义位图就是用每一位来保存数的状态的结构.位图是bitMap的缩写,适用于大规模数据但是数据状态又不是很多的情况的,因为一个位只有0和1两种状态,所以位图就是只用每一位来保存数的状态的结构. 二.一道海量数据查找的题> 在了解了位图的概念之后我们发现位图通常用于大规模的数据而且用于判断某一个数是否在这个范围之内,在这里就引出了这样一道海量原创 2016-11-09 10:58:54 · 918 阅读 · 0 评论 -
你到底有多少个朋友圈?
有这样一道面试题它是这样描述的:假设有n个人m对好友(存于二维数组r),如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈? 例:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1,2,3属于同一个朋友圈,4,5属于同一个朋友圈.结果为两个朋友圈原创 2016-11-28 20:30:37 · 728 阅读 · 0 评论 -
排序算法之归并排序
归并排序> 之前曾经实现过堆排序,它用到了完全二叉树,但是堆的设计本身就是比较复杂的,而今天要实现的归并排序同样的也用到了完全二叉树的思想,这种思想比堆排序较为简单. 归并排序是利用归并的思想实现的排序算法.它的思路是:我们将具有n个序列的无序的数组序列两两合并排序后再合并,最终获得了一个有序的数组.归并排序的实现也极其简单: 1).将这个数组分成两个区间.[st原创 2016-11-28 21:52:30 · 1001 阅读 · 0 评论 -
排序算法之插入排序
插入排序> 对于排序相信大家都不陌生,就是将一组数据按照从大到小(降序)或者是从小到大(升序)进行排列,那仫常见的排序算法有哪些呢?我总结了以下几种常见的排序算法,在本篇文章中我只介绍插入排序中的直接插入排序和希尔排序. 直接插入排序> //升序void InsertSort(int *a,size_t size){ as原创 2016-11-17 16:24:57 · 554 阅读 · 0 评论 -
关于哈希表的一点理解
哈希表> 哈希表也叫散列表,是依据关键码值(key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫散列表. 了解了什仫是哈希表之后,我们发现哈希表这种数据结构是类似于线性表的,只是表中的元素不是精密排列的,而是可能存在空间. 比如我们存储70个元素,但是我们原创 2016-11-02 21:12:21 · 1655 阅读 · 0 评论 -
红黑树
红黑树> 在之前实现了AVL树,其实红黑树和AVL树都是高效且平衡的二叉搜索树,增删查改的时间复杂度都是O(lg N).但是在实际应用中红黑树的应用最多,比如C++STL库--map/set,java库,Linux内核以及其他的一些库里都用到了红黑树,这是因为红黑树是不追求完全平衡的是一种近似平衡的二叉树,保证最长路径不超过最短路径的二倍,相对于AVL树来说降低了旋转的要求,所以性能会优原创 2016-10-28 13:30:22 · 831 阅读 · 0 评论 -
浅析B树的分裂过程
B-树> 最近一直在研究树的这种数据结构,今天实现了一颗适合外查找的平衡多叉树就是B树,有的地方也叫B-树(不要误读为"B减树"奥).当然了还存在B+树,B*树这里只实现B树 一.B树的性质> 一颗M阶(M>2)的B树,是一颗平衡的M路平衡搜索树,可以是空树或者满足下面几条性质> 1).根结点至少有两个孩子. 2).每个非根结点存在[M/2,M)原创 2016-11-12 13:02:50 · 10029 阅读 · 0 评论 -
栈&队列面试题之之两个栈实现一个队列
使用两个栈实现一个队列 剖析: 我们知道栈是后进先出的一种数据结构,而队列是先进先出的一种数据结构,如何用两个栈来模拟队列这种数据结构呢?利用栈的特性-后进的先出,我们先将数据压入栈1中,在Pop时我们可以将栈1的数据压入栈2中,再将栈2的数据出栈,这就满足了队列的先进后出的特性了. 在Front和Back的实现中.Front返回的是栈2的栈顶元素,B原创 2016-09-11 09:48:54 · 781 阅读 · 0 评论 -
栈&队列面试题之两个队列实现一个栈
两个队列实现一个栈 在之前我曾经实现了两个栈实现一个队列的面试题,其实思路也很简单就是充分利用栈的特性-后进先出,将输入的数据先输入栈1,将该栈1再输出到栈2,最后将栈2的数据输出,利用这个交换的特性实现两个栈实现一个队列. 那仫如何利用两个队列实现一个栈呢?思路分析篇: 其实思路类似之前的面试题-两个栈实现一个队列,也是通过交换的特性: (1).先将要输入的数据类似 1原创 2016-09-15 06:51:27 · 1084 阅读 · 0 评论 -
数据结构之广义表
广义表> 广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成的有限序列. 广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表. eg: (1).空表套空表((()))--深度为3(2).未出现子表(a,b)--深度为1(3).表中有表(a,b,(c,d))--深度为2(4).多层子表的嵌套(a,b,(c,d原创 2016-09-25 08:16:30 · 1917 阅读 · 0 评论 -
模拟实现顺序表-动态的存储方式
模拟实现顺序表-静态的方式 http://blog.csdn.net/qq_34328833/article/details/51494234 我们知道静态的存储方式中数组Data的大小是固定的是100,也就是说我们最多只能存储100组信息数据,当要增加信息数据时我们就需要扩大数组Data的大小,是不是很麻烦呢?这就要提出我们今天要实现的版本 -动态的存储方原创 2016-06-01 21:56:01 · 1684 阅读 · 0 评论 -
剑指offer面试题26之复杂链表的复制问题
如果认定了目标就一直朝前走下去,每天多一点心得理解也是很开心的啦!原创 2016-06-24 10:47:25 · 1464 阅读 · 2 评论 -
线性表的链式存储方式
今天这一篇是我动手实现的第三个数据结构的存储类型,真的收获很多,觉得数据结构其实是数据和它的存储结构的总和,一个数据没有存储结构那仫他在计算机中就如同没有稳定的“家”,此时我们是没有办法访问它的,今天就分享一下我实现链式表的一些心得希望能帮助那些数据结构的初学者。原创 2016-06-04 16:05:32 · 7137 阅读 · 0 评论 -
链表面试题之链表相交问题
如果你放弃那便没有人可以救得了你了,反而如果你坚持下去或许会有不一样的收获原创 2016-06-26 14:12:09 · 3534 阅读 · 0 评论 -
链表面试题之带环问题
面试题一:判断链表是否带环,如果链表带环则返回相遇点 pLinkNode Check_Cycle(pLinkList plist); 首先先给出代码的结构实现: typedef int DataType;typedef struct LinkNode{ DataType data; struct LinkNode *next;}LinkNode,原创 2016-06-20 11:57:44 · 1035 阅读 · 0 评论 -
链表面试题之约瑟夫环问题
每天进步一点,必将量表导致质变,加油!!!原创 2016-06-23 16:40:06 · 2101 阅读 · 0 评论 -
关于链表面试题的一些理解
相信自己的努力可以配得上自己的梦想原创 2016-06-13 08:17:18 · 1147 阅读 · 2 评论 -
链表面试题之合并有序的两个线性表-递归和非递归的方法
【问题描述】: 合并两个有序的线性表,例:两个线性表都是非递减有序序列,线性表1:3->5->8->11->over,线性表2:2->8->10->15->over,合并后的线性表也是递增有序的:2->3->5->8->8->10->11->15. 【问题分析】: 拿到这样一道题如何去分析呢?我们知道对于链式存储的线性表而言每个链式表都有它自己的头指原创 2016-06-06 16:27:40 · 1998 阅读 · 1 评论 -
C++中模板的那些事儿
C++模板的知识实现顺序表 模板:是泛型编程的基础 泛型编程:编写与类型无关的逻辑代码 说白了模板其实就是一个模具,它是在使用传类型时才存在一个推演的过程,简单的一个模板类的推演过程如下: 用模板的方式实现顺序表: #pragma once#include#includeusing na原创 2016-08-27 13:53:18 · 981 阅读 · 0 评论 -
C++实现双链表的基本功能
双链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域线性表的双向链表存储结构:typedef struct Node{ DataType _data; struct Node *_next; struct Node *_front;}Node; 通过双链表的存储结构我们发现双链表可以反向查找结点优于单链表 ,实质上双链表就是以原创 2016-08-23 14:13:11 · 5880 阅读 · 2 评论 -
栈的应用之后缀表达式的求解
后缀表达式的求解 在小学的运算中,我们经常接触到的数学表达式,它的规则也就是老生常谈的了-"先乘除,后加减,从左到右,先括号后括号外",但后来出现的四则运算,则要求优先级,计算更加复杂,而计算机解决这种问题的方法就是利用栈,这就引入了后缀表达式 后缀表达式的基本概念: 后缀表达式也叫逆波兰表达式,是一种不需要括号的后缀表达式(RPN),所有的运算符号都在数字的后面原创 2016-09-11 21:50:55 · 1206 阅读 · 0 评论 -
一个简单的迷宫算法
迷宫问题的求解是一个典型的问题,那仫如何找到迷宫的出口?在遇到死胡同的时候如何返回?如何防止走重复的路程?这就是我们要解决的问题了. 一.设置迷宫 要打印一个简单的迷宫,我们理所当然的想到了利用二维数组,在迷宫的实现中我定义了一个MazeMap.txt的文件用来存储迷宫,在初始化的时候只需要将该迷宫从mazeMap.txt中读出来就可以了. 0-路原创 2016-09-11 08:32:40 · 17765 阅读 · 0 评论 -
迭代器的使用之双向循环链表
模拟实现迭代器和用迭代器的方式实现双向循环链表 什仫是迭代器?> 迭代器是一个抽象的设计概念,它的定义为:提供一种方法,使之能够依序巡访某个容器所含的各个元素,而又无需暴露该聚合物的内部表述方式. 迭代器的设计思维> 将数据容器和算法分开,彼此独立设计,最后再以一帖胶着剂将他们撮合在一起. 迭代器到底是什仫呢?> 迭代器是类似智能指针的对象,在实原创 2016-09-15 13:58:14 · 2338 阅读 · 0 评论 -
数据结构之线索二叉树的前序,中序和后序遍历
BinaryTree线索化二叉树 二叉树是一种非线性结构,在之前实现的二叉树遍历中不管是递归还是非递归用二叉树作为存储结构时只能取到该结点的左孩子和右孩子,不能得到该结点的前驱和后继。为了保存这种在遍历中需要的信息,同时也为了充分利用结点中的空指针域,我们利用二叉树中指向左右子树的空指针来存放结点的前驱和后继.同时在有n个结点的二叉链表中必定存在n+1个空链域. 那仫问题来原创 2016-10-09 19:24:15 · 18234 阅读 · 7 评论 -
对称矩阵&稀疏矩阵的两种转置算法
SymmentryMatrix(对称矩阵) 对称矩阵和对称矩阵的压缩存储> 设一个N*N的方阵Array,Array中任意元素Arrayij,当且仅当Arrayij == Arrayji(0 我们发现如果将该对称矩阵的每个元素都存入则会存在内存浪费问题,那仫如何解决? 这就提到了对称矩阵的压缩存储了--则只需要存储上三角或者下三角的元素即可。 注意:原创 2016-09-23 12:27:50 · 2886 阅读 · 0 评论 -
排序算法之计数&基数排序
计数排序> 给定一组待排序的数据,找到这组数据中的最大值,然后开辟一个最大值加1的数组,用memset初始化为全0,然后再次遍历原数组,使得这个新开辟的数组中存储的是该数字出现的次数,此时只需要将新数组的内容写入原数组即可. 我们发现计数排序其实利用的是哈希的思想来统计次数,是一种非比较的排序,它的时间复杂度为O(N+范围),因为计数排序是一种以空间换取时间的原创 2016-12-03 10:52:32 · 786 阅读 · 0 评论