结构与算法
文章平均质量分 57
cvanchen
学如登山,朝夕不倦!
展开
-
ACM练习建议
一位高手对我的建议: 一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。下面给个计划你练练:第一阶段: 练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来.1.最短路(Floyd、Dijstra转载 2012-02-27 17:54:05 · 1086 阅读 · 1 评论 -
哈夫曼编码
哈弗曼编码几乎是所有压缩算法的基础,其实这个算法并不复杂,简单的理解就是,如何用更短的bit来编码数据。我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit:字符编码A00101001B00101010C00101011…… 这样,计算机就能很方便的把由0和1转载 2013-09-22 16:14:07 · 1314 阅读 · 0 评论 -
堆排序(大根堆)
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶转载 2013-09-22 15:47:45 · 28345 阅读 · 2 评论 -
B-树和B+树的应用:数据搜索和数据库索引
1 .B-树定义B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树;⑵若根结点不是叶子结点,则至少有两棵子树;⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,…,Kn,A转载 2013-09-23 21:17:07 · 1278 阅读 · 0 评论 -
B树、B-树、B+树、B*树 红黑树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关转载 2013-09-23 21:19:31 · 1120 阅读 · 0 评论 -
教你透彻了解红黑树
教你透彻了解红黑树 作者:July、saturnman 2010年12月29日本文参考:Google、算法导论、STL源码剖析、计算机程序设计艺术。推荐阅读:Left-Leaning Red-Black Trees, Dagstuhl Workshop on Data Structures, Wadern, Germany, February,转载 2013-09-23 21:22:05 · 1273 阅读 · 0 评论 -
从B树、B+树、B*树谈到R 树
从B 树、B+ 树、B* 树谈到R 树 作者:July、weedge、Frankie。编程艺术室出品。说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成。出处:http://blog.csdn.net/v_JULY_v 。 第一节、B树、B+树、B*转载 2013-09-23 21:25:01 · 1823 阅读 · 0 评论 -
从头到尾彻底解析Hash表算法
从头到尾彻底解析Hash 表算法作者:July、wuliming、pkuoliver 出处:http://blog.csdn.net/v_JULY_v。 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。---------------------------转载 2013-09-23 21:32:39 · 5873 阅读 · 4 评论 -
一步一图一代码,一定要让你真正彻底明白红黑树
一步一图一代码,一定要让你真正彻底明白红黑树 作者:July 二零一一年一月九日-----------------------------本文参考:I、 The Art of Computer Programming Volume III、 Introduction to Algorithms, Second EditionIII、The Annota转载 2013-09-23 21:35:49 · 149973 阅读 · 23 评论 -
trie树简介
本博客(http://blog.csdn.net/livelylittlefish )贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!Content1. trie基础(1) 是什么?(2) 性质(3) 应用(4) 优点2. 一个例子(1) 功能(2) 代码(3) 运行结果(4) 分析转载 2013-09-23 21:40:06 · 1460 阅读 · 0 评论 -
计数排序、桶排序和基数排序
计数排序当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序转载 2013-09-23 21:42:03 · 921 阅读 · 0 评论 -
一个整数分解为连续正整数之和
为了找份暑期实习生的工作,今天去某公司面试。很喜欢这样的公司,首先不问出身、不问爱好,直接给你一台电脑,几道编程题目,让你写程序。其中有道题目是将一个整数分解为连续正整数之和,如15可以分解为:15 = 1 + 2 + 3 + 4 + 515 = 4 + 5 + 615 = 7 + 8这道题,我用最死板的方法给编出来了。输入数n,设置起始位置i,再遍历连续正原创 2013-09-24 20:45:28 · 11377 阅读 · 3 评论 -
最大子序列和
最大子序列和一个考试比较常见但是却又不是很难的算法题,因此,我们很有必要好好理解并消化它。我们以一个例题来说明一下吧(网上找的):输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最原创 2013-09-15 22:53:53 · 893 阅读 · 0 评论 -
递归求数组最大最小值(分治思想)
求数组最大最小值我们可以用遍历或者最简单的排序方法来实现,但是那样子的时间复杂度将会大很多,因此我们可以采用分治思想来求最大最小值,即先求左右两部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然后再把左右两部分的最大最小值合起来求总的最大最小值。代码如下:#includeusing namespace std;/* author:chhuaj date:20原创 2013-09-13 19:53:19 · 12721 阅读 · 2 评论 -
最小生成树(Prim算法)
最小生成树是一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树其实是最小权重生成树的简称。其一般应用于无向图。求最小生成树有两个算法:Prim算法和Kruskal算法。在这里我主要针对Prim算法解释。普里姆(Prim)算法思想普里姆算法则从另一个角度构造连通网的最小生成树。它的基本思想是:首先选取图中原创 2013-09-13 16:25:46 · 1945 阅读 · 0 评论 -
树、森林与二叉树的转换
从树的孩子兄弟表示法和二叉树的二叉链表表示法可以看出,树的孩子兄弟表示法实质上是二叉树的二叉链表存储形式,第一个孩子指针和右兄弟指针分别相当于二叉链表的左孩子指针和右孩子指针。所以,从物理结构上看,树的孩子兄弟表示法和二叉树的二叉链表是相同的,只是解释不同而已,如图5-32所示。 以二叉链表作为媒介,可导出树和二叉树之间的一个对应关系。也就是说,给定一棵树,可以找到唯一的一棵二原创 2013-06-23 13:01:14 · 5703 阅读 · 1 评论 -
归并排序的原理及时间复杂度
归并排序的定义归并排序算法采用的是分治算法,即把两个(或两个以上)有序表合并成一个新的有序表,即把待排序的序列分成若干个子序列,每个子序列都是有序的,然后把有序子序列合并成整体有序序列,这个过程也称为2-路归并.注意:归并排序的一种稳定排序,即相等元素的顺序不会改变.归并排序的原理常见的排序主要有两种,一种是先把待排序的序列一次分割,使子序列的长度减小至1,然后在合并,另外一种是把待排原创 2013-07-11 02:03:14 · 44226 阅读 · 3 评论 -
从头到尾彻底解析Hash表算法
作者:July、wuliming、pkuoliver 出处:http://blog.csdn.net/v_JULY_v。 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。------------------------------------ 第一部分转载 2013-06-30 23:17:13 · 3405 阅读 · 2 评论 -
哈希表总结
哈希表的概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。散列存储的基本思路 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间原创 2013-07-01 00:32:16 · 38116 阅读 · 5 评论 -
哈夫曼树的构造
构造哈夫曼树的过程是这样的一、构成初始集合 对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。) 二、选取左右子树 在F中选取两棵根结点权转载 2013-07-01 00:39:47 · 1346 阅读 · 0 评论 -
“Cache-主存”和“主存和辅存”的区别
最近在学习的时候碰到了一个关于“Cache-主存”和“主存和辅存”的区别,平时学习都只是大概了解一下,但是具体的区别没有深入学习,所以这次既然碰到了就仔细了解一下。 “cache-主存”指 在 CPU 和主存之间增加一级速度快、但容量较小且每位价格较高的高速缓冲存储Cache)。借助于辅助软硬件,它与主存构成一个有机的整体,以弥补主存速度的不足。这个 层次的工作主要由硬件实现原创 2013-09-01 00:35:34 · 21688 阅读 · 2 评论 -
Floyd算法
最近在准备招聘的时候看到了华为的一道关于floyd算法的题,故在想总结一下这个算法以加深我对这个算法的理解。 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。该算法的可信思想主要由三重循环构成,故该算法的时间复杂度为O(n^3). 其状原创 2013-09-13 13:14:49 · 1178 阅读 · 0 评论 -
几种最短路径算法的比较
用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介绍其中的三种。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括:确定起点的最短路径问题转载 2013-09-13 14:00:12 · 1337 阅读 · 0 评论 -
Dijkstra算法
#include#includeusing namespace std;const int MIN=1000000;int flag[5];int a[5][5];int dis[5];int main(){ memset(flag,0,sizeof(flag)); memset(a,MIN,sizeof(a)); //初始化矩阵 int dian,bian; int原创 2013-09-13 15:50:05 · 1073 阅读 · 0 评论 -
求数组中超过一半的元素
解题思路:设置一个当前值和当前值的计数器,初始化当前值为数组首元素,计数器值为1,然后从第二个元素开始遍历整个数组,对于每个被遍历到的值a[i]1 如果a[i]==currentValue,则计数器值加12 如果a[i] != currentValue, 则计数器值减1,如果计数器值小于0,则更新当前值为a[i],并将计数器值重置为1#includeusing namespa原创 2013-09-13 20:17:47 · 1198 阅读 · 0 评论 -
求数组中元素的最短距离
题目:给定一个含有n个元素的数组,找出数组中的两个元素X和Y使得abs(x-y)最小解题思路:先排序,然后遍历元素。#include//#include#includeusing namespace std;/* author:chhuaj date:2013.9.13 description:给定一个含有n个元素的数组,找出数组中的两个元素X和Y使得abs(x-原创 2013-09-13 21:26:43 · 4659 阅读 · 1 评论 -
正整数n的所有可能和式的组合
很多人在面试中会被问到这样的题目,题目的含义是有如下的组合4=1+1+1+1、1+1+2、1+3、2+1+1、2+2。光从题目来看有两种理解:将3 = 1 +2 和3 = 2 +1当作不同的组合。这种情况是比较简单的,直接将给定的n递归地分解成(n – 1) + 1当递归求得的结果和我们需要分解的整数n相等,则这次分解就完成了,我们可以把分解的组合输出来,然后返回。一直递归到n不能再分解(转载 2013-09-24 18:07:06 · 1858 阅读 · 0 评论