数据结构
文章平均质量分 78
pawnsir
这个作者很懒,什么都没留下…
展开
-
C语言实现C到C++的注释转换
C语言中的注释一般为/*......*/来标注,C++的注释一般为//来标注,为了完成注释的转换,我考虑了一下几种情: 1.一般情况 /* int i = 0; */ 这是最通常的情况,当遇到/*时把其替换成//,遇到*/时直接跳过 2.换行问题 /* int i = 0; */int j = 0; /* int i = 0; */ int j = 0;原创 2016-05-28 18:35:21 · 357 阅读 · 0 评论 -
【干货】位图的实现与布隆过滤器
位图是用一个btye位来表示一个数据是否存在,再通过哈希函数确定一个数据所在的位置,这样处理会使当仅需要判断一个数据在不在的时候大大的提高效率,缩小内存的使用,如一个数据为int型,而一个int型的数据构成的位图能表示32个数据的存在状态。代码实现如下:Bitmap.h:#includeclass BitMap{public: BitMap(size_t size) :_size(0)原创 2016-05-28 18:37:09 · 315 阅读 · 0 评论 -
【干货】C++哈希桶(开链法解决哈希冲突)类的实现
开链法(哈希桶)是解决哈希冲突的常用手法,结构如下:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/80/11/wKiom1c1z0jiqWopAAAtDyd3Kyk688.png" title="QQ截图20160513205751.png" alt="wKiom1c1z0jiqWopAAAtDyd3Kyk688.png" />原创 2016-05-28 18:37:06 · 776 阅读 · 0 评论 -
【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
二次探测是避免哈希冲突的一种常见手段,思想是: 插入: 找到哈希位置(serch)->如果不冲突就插入,冲突就进行第一次探测 第1次探测: 哈希位置变为原有哈希位置加上1*1的偏移->进行插入 .... .... 第i次探测: 哈希位置变为原有哈希位置加上i*i的偏移->进行插入 知道插入完成为止。如图所示:650) this.width=65原创 2016-05-28 18:36:58 · 244 阅读 · 0 评论 -
堆排序算法思路详解
堆排序是一种常见的排序算法,其时间复杂度为O(logN),重要思想为建堆取极值,根据需求进行排序,如下图:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7F/F4/wKiom1cytEnhY-J0AAAfaiVgGAE014.png" title="QQ截图20160511122650.png" alt="wKiom1cytEn原创 2016-05-28 18:36:55 · 467 阅读 · 0 评论 -
【代码】c++堆的简单实现
堆对象的创建与实现的核心思想就是上调(adjustup)与下调(adjustdown)的算法思想,上调用于创建堆时,从第一个非叶子节点开始向根节点根据需求调整为大堆或者小堆 下调如图示:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7F/D5/wKiom1cvCpfjuPkkAAAkCLyIQjQ600.png" titl原创 2016-05-28 18:36:52 · 340 阅读 · 0 评论 -
二叉树的线索化算法思想详解
二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下:650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7F/9E/wKioL1clqWXAc9hmAAAeyeZzebo767.png" title="QQ截图20160501145538.png原创 2016-05-28 18:36:49 · 1017 阅读 · 0 评论 -
【代码】C++实现二叉树基本操作及测试用例
二叉树是一种常见的数据结构,这里我们需要要注意的是,二叉树的非递归的遍历。 先序遍历,中序遍历,后序遍历 这三种遍历,如果用非递归的方式实现,我们则需要借助栈这个结构,首先我们需要遍历所有左子树的左节点。进行压栈,完成压栈之后,根据不同的需求,判断是否该继续访问或者弹出亦或者是压入该节点的右子树。 层序遍历 不同于其他的遍历方式,层序遍历是以根节点为开始,依次向下,每层从左原创 2016-05-28 18:36:47 · 1552 阅读 · 0 评论 -
【代码】C++实现广义表及其测试用例
广义表是我第一次用递归接触链式的数据结构,其结构如下: HEAD->VAL->VAL->LINK(->HEAD.....)->VAL->...... 在这里,我们的头结点与link节点是不存储数据的,由此我们便可以定义出节点的数据结构:typedef int DataType;enum NodeType//枚举类型定义节点类型{ HEAD, VALUE, SUB,};st原创 2016-05-28 18:36:44 · 452 阅读 · 0 评论 -
【干货】容器适配器实现两个栈模拟队列
用两个栈模拟队列的思想就是“倒水思想”,这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下:#include#include#includestruct __TrueType//类型萃取{ bool Get() { return true; }};struct __FalseType{ bool Get() { retu原创 2016-05-28 18:36:41 · 236 阅读 · 0 评论 -
【技巧】通过适配器模式完成栈的数据结构
学习了模板,我们发现,c++中的众多数据结构,如栈与队列跟模板,只是方法上与线性表不同,其真正意义上的结构,也就是线性表,代码如下:template class SeqList{private : int _size ; int _capacity ; T* _data ;};// template class Container>template原创 2016-05-28 18:36:26 · 334 阅读 · 0 评论 -
求最大公约数的设计与C语言实现
求最大公约数是一常见的数学问题,数学思维中的常用求法有指数分解、短除法、辗转相除和更相减损法,其中前两个算法通过代码实现的效率是非常低的,我能想到的方法只有首先就需要一个求质数算法的表达式来表示无穷大的质数集合,然后再试模判断,成功后进行分解。在这里我们主要研究后两个算法的设计与C语言的实现。 1、辗转相除法 其方法顾名思义,就是大数模小数取余,再用余数与小数进行比较,继续重复原创 2016-05-28 18:35:38 · 501 阅读 · 0 评论 -
用C语言实现二分查找算法
二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组。若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这原创 2016-05-28 18:35:36 · 33099 阅读 · 6 评论 -
C++实现链表的进本操作及测试用例
今天实现了下链表的基本操作,包括节点的创建,头插尾插,头删尾删,一次遍历寻找链表的中间节点,寻找链表的倒数第x个节点,删除无头链表的非尾节点,链表的逆置,代码如下:#include "SLinkList.h"#include #include #include void PrintList(SListNode* pHead)//从指针位置打印链表{while (pHead){pri原创 2016-05-28 18:35:27 · 249 阅读 · 0 评论 -
C语言实现顺序表的增删查改以及排序
顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,今天我用C语言实现下线性表的基本操作,以及冒泡排序与选择排序在线性表中的算法实践,代码如下:seqlist.h:#ifndef __SEQLIST__#define __SEQLIST__#define MAX 5#include typedef int DataType;typedef struct SeqList{Dat原创 2016-05-28 18:35:24 · 1012 阅读 · 0 评论 -
【剑指offer】如何通过先序遍历与中序遍历重建二叉树
要用代码实现重建二叉树的话,我们必须了解先序遍历与中序遍历确定二叉树的过程,如给定先序遍历序列为 1, 2, 4, 7, 3, 5, 6, 8,中序遍历序列为4, 7, 2, 1, 5, 3, 8, 6。其主要思想就是先序序列确定根节点,中序遍历确定左右子树,解析如下:(图太丑- -。意思到了就行哈)由图我们可以看出来,这实质就是一个递归问题,退出递归的限定条件我们可以用左右子原创 2016-07-07 23:24:40 · 568 阅读 · 0 评论