Data Structure
文章平均质量分 66
bigface1234fdfg
贴在地上过日子,有个好处就是,摔也摔不到哪儿去。
展开
-
位图思想
位图思想如何在一个shu'ju'liang原创 2014-05-13 14:56:30 · 798 阅读 · 0 评论 -
求前K小的数和第K小的数
求前K小的数和第K小的数1. 前K小的数 (堆排序实现)#include#include#include using namespace std; // 调整堆函数void HeapAdjust(int *a, int i, int size) // a:数组;i:节点index;size:树的规模{ int lchild = 2 * i + 1; // 节点的原创 2015-01-28 10:11:30 · 911 阅读 · 0 评论 -
STL容器(二)——map
关于map容器的使用方法原创 2014-10-13 19:14:41 · 761 阅读 · 0 评论 -
准确实现二分查找方法
准确写出二分查找法很重要,因为其中有许多地方容易出错。 主要有下面几点:right初始值为num-1;每次更新right=middle-1; 每次更新middle为left+((right-left)>>1); 注意使用移位,以及移位运算符加括号!原创 2014-12-10 11:29:20 · 1158 阅读 · 0 评论 -
STL容器(一)——List
STL容器之List原创 2014-10-19 07:45:37 · 599 阅读 · 0 评论 -
STL容器(三)——对map排序
STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序;根据value排序。下面我们就分别说一下~1. 根据key进行排序 map默认按照key进行升序排序,和输入的顺序无关。如果是int/double等数值型为key,那么就按照大小排列;如果是string类型,那么就按照字符串的字典序进行排列~(还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列的情原创 2014-12-12 09:18:53 · 12870 阅读 · 1 评论 -
复习数据结构:排序(一)——插入排序
从这一篇开始,我开始复习数据结构的知识点,博文主要偏重于每个知识点的核心思想,以及代码实现。这一篇先从排序算法中的插入排序开始。 稳定排序、内排序、适合少量数据量的排序。当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2)。当输入数组倒序排列时,插入排序时复为:O(n^2)。平均时间复杂度:O(n^2)。插入排序的基本做法是:将一个数插入到一个已原创 2015-02-21 08:46:42 · 1486 阅读 · 0 评论 -
复习数据结构:排序(三)——选择排序
选择排序的核心是:每趟选择最小的元素和首部交换。 时间复杂度:O(n^2)。 选择排序是一种不稳定的排序,为什么呢?因为不好处理相等两个数的前后位置,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。所以稳定排序是一定不会改变相等数之间之前位置关系的。原创 2015-02-21 15:39:04 · 933 阅读 · 0 评论 -
复习数据结构:排序算法(二)——冒泡排序
这篇复习冒泡排序。 冒泡排序也是一种稳定排序、内排序。 冒泡排序的基本思想:对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。插入排序比冒泡排序快! 上面说的是普通的冒泡排序算法,时间复杂度是O(n^2),这种方法只能一趟排序原创 2015-02-21 08:49:45 · 1434 阅读 · 0 评论 -
复习数据结构:排序算法(五)——快速排序的各种版本
之前已经比较熟悉快排的基本思想了,其实现的方式也有很多种。下面我们罗列一些常见的实现方式:版本一:算法导论上的单向扫描,选取最后一个元素作为主元#includeusing namespace std; int partition(int data[], int low, int high){ int pivot = data[high]; // let the原创 2015-02-24 16:41:23 · 942 阅读 · 0 评论 -
复习数据结构:排序算法(四)——归并排序
基本思想:基于分治法,即把待排序的数组序列,分为若干个子序列,对每个子序列排序,然后再把所有有序的子序列合并为一个整体有序的序列。分析可知,如果拿任何一个元素作为子序列,那么所有子序列就已经是有序的,而归并排序的关键就在于如何合并,也就是“归并”。 归并排序是外排序,稳定排序,时间复杂度是O(nlogn). 详细说归并排序的过程:1个原创 2015-02-23 16:00:39 · 691 阅读 · 0 评论 -
栈在O(1)时间内求min值
思路:1:在stack的数据结构中加两个个字段,如 typedef struct { int data[MAX]; // 存储栈中的所有数 int top; // 存储栈顶元素在data数组中的位置 int min; // 最小值 int second; // 次小值}stack;原创 2015-02-23 17:30:35 · 2570 阅读 · 1 评论 -
复习数据结构:排序算法(七)——桶排序
桶排序是一种稳定的排序方法,也是一种外排序。 桶排序的时间复杂度:最坏情况运行时间:当分布不均匀时,全部元素都分到一个桶中,则O(n^2),当然[算法导论8.4-2]也可以将插入排序换成堆排序、快速排序等,这样最坏情况就是O(nlgn)。最好情况运行时间:O(n)。 也就说,前面介绍的排序算法要么是O(n^2),要么是O(nlogn),只有桶排序是可能实现O(n)排序的原创 2015-02-25 16:04:29 · 1117 阅读 · 0 评论 -
复习数据结构:排序算法(八)——基排序
基排序是外排序,稳定的排序算法。 它的时间复杂度:O(d(r+n)),d为每个数的长度,r表示基数,n表示数组中元素的个数。 基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12、 104、 13、 7、 9(1)按个位数排序是12、13、104、7、9(2)再根据十位排序104、7、9、12、13(3)再根据百原创 2015-02-25 16:37:52 · 1494 阅读 · 0 评论 -
关于栈的几道面试题目
1. 括号匹配http://wenku.baidu.com/link?url=ExL5fVcWJJR2x_l5AWK9znXY98YGwLSYo56ZJtju4Ql6dJKvkHWGkBNPcfGLzm57bIQFwQKFt1dRgjE27N8EMfD462UyYtjGo3d_A8WZbna主要解题思想是遇到左括号,入栈;遇到右括号,出栈。当发现需要出栈的元素不匹配的时候,说明括号原创 2015-02-24 16:09:07 · 932 阅读 · 1 评论 -
复习数据结构:排序算法(六)——堆排序
对于堆排序,前面一篇博文中已经复习到了堆排序,这里就简单介绍一下,并给出核心部分的解释。 堆排序是一种不稳定的排序,也是内排序。 时间复杂度为O(nlogn)。以最大堆为例,堆排序的基本思想是:1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区;2)将堆顶元素R[1]与最后一个元素R[n]原创 2015-02-25 09:42:00 · 825 阅读 · 0 评论 -
链表反转的递归和非递归实现方式
链表反转是数据结构的基本功,主要有递归和非递归两种实现方式。我们一一介绍如下:1. 非递归实现 主要包括如下4步: 1)如果head为空,或者只有head这一个节点,return head即可; 2)从头到尾遍历链表,把reversedHead赋值给当前节点的next; 3)当前节点赋值给reversedHead; 4)遍历结束,ret原创 2015-05-04 23:04:47 · 3334 阅读 · 0 评论 -
STL容器(五)——heap
STL容器(五)——heap 我们可以调用STL中的heap堆,实现建堆和堆排序等操作。 首先,STL中的heap默认构建的是最大堆,程序如下:#include#include#includeusing namespace std; int main(){ int a[]={2, 3, 5, 1, 9, 6}; vector vec(a原创 2015-01-27 18:08:31 · 1122 阅读 · 0 评论 -
实现堆排序
实现堆排序 1. 堆排序的思想 堆是一棵完全二叉树,任何一个节点的val不大于(最小堆)或者不小于(最大堆)其左右孩子节点的关键字。 以最大堆为例,堆排序的基本思想是:1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区;2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,原创 2015-01-27 15:51:01 · 1597 阅读 · 0 评论 -
程序员编程技术学习笔记
程序员编程技术学习笔记 看july的博客也有好久了,一直没能好好整理一下自己的学习笔记,开了博客之后更加愿意好好整理一番了。其中不免有些内容在july那里可以找到原文,但是更多的加入了我个人的理解。这个系列也是对那句“一直有深入理解数据结构的计划”的回答吧~1. 左旋转字符串原创 2014-11-27 08:09:01 · 1100 阅读 · 0 评论 -
如何实现等概率事件
如何实现等概率事件等概率时间在日常生活中都是非常常见的,原创 2014-05-13 15:43:35 · 1142 阅读 · 0 评论 -
如何求逆序数
逆序数在很多算法中都有涉及,下面的一篇文章把如何求解一个数列或是字符串的逆序数讲解的较为清楚了。http://blog.csdn.net/dlengong/article/details/7594919我们现在用到的是一个长度和n的list或者string,最大逆序数为n*(n-1)/2。原创 2014-09-27 16:48:19 · 695 阅读 · 0 评论 -
堆栈和队列
堆栈堆栈是限定插入和删除操作都在表的同一端进行的线性表。允许插入和删除元素的一端称为栈顶,另一端称为栈底。若栈中无元素,则称为空栈。一定要记住的是:栈有后进先出的特点,Lase In First Out,LIFO。栈的基本操作除了插入和删除外,还有建立和撤销栈等操作。Creat():建立一个空栈;Destroy():撤销一个栈;IsEmpty():若栈为空,则返回true,否则原创 2014-05-27 16:45:09 · 805 阅读 · 0 评论 -
周期串问题
有一类题目:一个字符串可以由某个长度为k的字符串重复多次得到,该串以k为周期。例如,abcabcabcabc以3为周期,也以6和12为周期,那么如何求它的最小周期?求解这一类的周期性的题目,有个关键:周长一定可以被串长整除,故我们无需判断所有的i-len,只需要判断能被len整除的i;其次,我们的i从小开始遍历,即for(int i=0; i还有一个模板,当我们需要逐一比较原创 2014-09-27 17:15:51 · 674 阅读 · 0 评论 -
入门二叉树的世界
http://blog.csdn.net/karldoenitz/article/details/8180297http://blog.csdn.net/luckyxiaoqiang/article/details/7518888http://whg841001.blog.163.com/blog/static/1765782720098263203575/二叉转载 2014-09-27 17:21:48 · 841 阅读 · 0 评论 -
亲和数问题学习笔记——调和级数和回溯算法
亲和数问题学习笔记——调和级数和回溯算法题目描述:求500万以内的所有亲和数。如果两个数a和b的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。例如:220和284,1184和1210,2620和2924. 需要注意的是关于真因数的定义:出去整数本身之外的所有因子都称作该整数的真因子,这里是包括1的。原创 2014-05-06 10:38:53 · 1826 阅读 · 0 评论 -
qsort函数的使用方法
还记得看qsort的时候是晚上回到宿舍,一般吃的泡椒凤爪,一bian原创 2014-09-27 17:00:16 · 617 阅读 · 0 评论 -
链表初解
链表初解做链表追赶问题的原创 2014-05-09 14:42:08 · 544 阅读 · 0 评论 -
STL中map, list, and pair的学习笔记
STL中map, list, and pair的学习笔记原创 2014-05-05 14:53:00 · 3052 阅读 · 0 评论 -
用左移来实现*2^n
在C语言中,我们就有左移>运算符;在C++中,左右移运算符又被扩展到了cin>>和cout不过即使在C++中,我们还是可以用左移>运算符来实现2^n。左移a右移>>: 除以2a>>b就是a/(2^b)。这里需要注意的是a和b一定钥匙int型数。原创 2014-09-27 17:18:18 · 808 阅读 · 0 评论 -
入门二叉搜索树的世界
入门二叉搜索树的世界1. 二叉搜索树的概念 二叉搜索树,二叉查找树,二叉排序树说的都是一个概念。这篇博文中我们称其为二叉搜索树。二叉搜索树指的是一棵空树,或者具有下列性质的二叉树:1)弱左字数不空,则左子树上所有节点的值均小于根节点的值;2)若右子树不空,则右子树上所有节点的值均大于根节点的值;3)左、右子树也分别为二叉搜索树; 2. 二叉搜索树的程序实现原创 2014-10-21 14:25:13 · 873 阅读 · 1 评论 -
入门数据结构的世界
入门数据结构的世界系列地介绍了数据结构知识点。原创 2014-11-03 16:32:55 · 811 阅读 · 0 评论 -
入门二叉平衡树的世界
入门二叉平衡树的世界原创 2014-10-22 11:05:06 · 1080 阅读 · 0 评论 -
入门B-树的世界
入门B-树的世界 很久之前,看过一篇关于外存磁盘数据搜索的讲解稿,偶然看到B树的知识。当时青涩地觉着:高大上的数据结构啊,渊博的data structure啊~~哈哈哈,今天我终于可以来了解一下这种外存数据结构:B树。1. B树的引入 前面我们介绍的二叉搜索树(二叉查找树)、AVL树等等都是当数据存储在内存中对应的搜索结构。当我们在内存数据中搜索的时候,用AVL树表示就可以原创 2014-11-11 21:46:33 · 1246 阅读 · 0 评论 -
快速幂取模
快速幂取模原创 2014-10-10 08:39:10 · 807 阅读 · 0 评论 -
入门链表的世界
入门链表的世界原创 2014-10-11 10:57:20 · 1066 阅读 · 0 评论 -
STL容器(四)——hash_map
STL容器(四)——hash_map 1. hash_map简介 hash_map和前面介绍的map既有很多的联系,也要必须要了解的区别~ hash_map的用法和map是一样的,提供了insert,size,count等操作,并且里面的元素也是以pair类型来存贮的。虽然对外部提供的函数和数据类型是一致的,但是其底层实现是完全不同的,map底层的数据结构是红黑树rb_tree;而hash_map却是哈希表hash_table来实现的。 我们可以通过一段小程序来了解h原创 2014-12-16 09:13:07 · 1357 阅读 · 0 评论 -
kSum问题的总结
kSum问题是一类题型,常见的有2Sum,3Sum,4Sum等。这篇博文就来总结一些kSum问题的解法,以及对应的时间复杂度。 1. 2Sum 在一个给定的数组nums中,寻找和为定值target的两个数。 【解法1】:把数组排序,然后使用two pointers的方法来求解。时间复杂度分析:排序O(nlogn),两指针遍历O(n),总体O(nlogn).原创 2015-05-07 11:11:07 · 2504 阅读 · 0 评论