数据结构与算法
文章平均质量分 76
dazhong159
这个作者很懒,什么都没留下…
展开
-
查找----二分查找法
1、二分查找法 二分查找法有一个很重要的前提条件:即待查找的序列必须是已经排好序的。 假设元素序列是按升序排列,将序列中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将序列分成前、后两个子序列,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子序列,否则进一步查找后一子序列。重复以上过程,直到找到满足条件的记录,查找成功,返回元素在序原创 2012-08-25 10:59:08 · 3257 阅读 · 0 评论 -
查找----深入探索散列查找
1、散列函数 把任意长的输入消息串变化成固定长的输出串的一种函数。这个输出串称为该消息的杂凑值。一般用于产生消息摘要,密钥加密等。常见的散列函数构造方法如下: (1)直接定址法 例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。 (2)数字分析法 有学生的生日数据如下: 年.月.日 75.10.03 7原创 2012-08-25 11:19:23 · 925 阅读 · 0 评论 -
查找子字符串----KMP算法深入剖析
假设主串:a b a b c a b c a c b a b 子串:a b c a c1、一般匹配算法逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c b a b a b c 第二趟 a b a b c a b c a c b a b a 第三趟 a b a b c a b c a c原创 2012-09-12 16:25:57 · 2906 阅读 · 0 评论 -
图论----深度优先遍历和广度优先遍历
1、广度优先遍历 广度优先遍历从某个顶点v出发,首先访问这个结点,并将其标记为已访问过; 然后顺序访问结点v的所有未被访问的邻接点{vi,..,vj},并将其标记为已访问过; 然后将{vi,...,vj}中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。具体代码实现时:我们可以使用一个辅助队列q,首先将顶点v入队,然后循环检测原创 2012-09-11 22:42:16 · 1618 阅读 · 1 评论 -
多路查找树开篇
1、引言 以前我们所讨论的数据结构,处理数据都是在内存中。假如我们所要操作的数据集非常大,大到内存无法处理了怎么办?如数据库上千万记录的数据表、硬盘中上万个文件等。在这种情况下,对数据的处理需要不断的从硬盘等存储设备中调入或者调出内存页面。而过多的进行IO读写,显然会降低系统的效率。为了降低对外存的访问次数,我们就需要新的数据结构来处理这样的问题。2、2-3树原创 2012-09-11 22:40:45 · 4553 阅读 · 0 评论 -
图论----最短路径
1、Floyd算法 原理:图中任意两点之间的最短距离等于两点之间的直接距离和经过其他中间节点的距离之和的最小距离,即D[i][j] = min{ D[i][j] , D[i][k] + D[k][j] },Floyd通常用来求所有顶点到所有顶点的最短路径。代码如下:#include "stdafx.h"#include #include #pragma warn原创 2012-09-11 22:39:37 · 870 阅读 · 0 评论 -
精选微软等公司数据结构+算法面试100题带答案(41-60)
41、求固晶机的晶元查找程序。晶元盘由数目不详的大小一样的晶元组成,晶元并不一定全布满晶元盘,照相机每次这能匹配一个晶元,如匹配过,则拾取该晶元,若匹配不过,照相机则按测好的晶元间距移到下一个位置。求遍历晶元盘的算法 求思路。(不懂)42、两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5。另外只能输出结果,不能修改两个链表的数据。思路:只用输出结果,并不转载 2012-08-30 17:14:32 · 3768 阅读 · 0 评论 -
精选微软等公司数据结构+算法面试100题带答案(1-10)
1、输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表:4=6=8=10=12=14=16。#include #include "stdafx.h"//数据结构struct BSTreeNode{ int m_nValue;转载 2012-08-28 12:37:57 · 2866 阅读 · 0 评论 -
精选微软等公司数据结构+算法面试100题带答案(11-30)
11、如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 思路:求树的高度。参考:http://blog.csdn.net/dazhong159/article/details/786277412、题目:求1+2+…+n,要求不能使用乘除法、for、while、if、els转载 2012-08-28 10:45:19 · 1127 阅读 · 0 评论 -
精选微软等公司数据结构+算法面试100题带答案(81-85)
81、第1组百度面试题1)一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 分析:有题目知,因为满足条件的a[i],其左边所有的数都小于等于它,右边所有的数都大于等于它,所以该数在数组中相当于已经排好序了。所以我们只需要将排好序的数组与原始数组相比,同一下标对应元素值相同转载 2012-09-03 10:34:12 · 3290 阅读 · 1 评论 -
排序----希尔排序
1、希尔排序 算法思想简单描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。 算法先将要排序的一组数按某个增量d分成若干组,每组中记原创 2012-09-12 14:58:25 · 733 阅读 · 0 评论 -
输入一个正数 n,输出所有和为 n 连续正数序列。
1、输入一个正数 n,输出所有和为 n 连续正数序列 例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、4-6 和 7-8。 分析:我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为 1,big初始化为 2。如果从small到big的序列的和大于n的话,我们向右移动smal原创 2012-09-18 15:18:52 · 6462 阅读 · 0 评论 -
B-树、B+树、B*树的区别
1、二叉搜索树 性质:所有非叶子结点至多拥有两个儿子(Left和Right);每个结点存储一个关键字;非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。 搜索:从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应原创 2012-09-11 22:41:03 · 32068 阅读 · 7 评论 -
排序----堆排序
1、堆数据结构 堆数据结构:是一种数组对象。它可以视为一个完全二叉树,数中的每个节点和数组的每个元素一一对应。 最大根堆:堆中最大值存放在根节点中。并且以某一节点为根的子树中,各节点的值都不大于该子树根结点的值。2、维护堆的性质 我们假设某一节点A[i],以A[i]的左孩子A[LEFT[i]]和右孩子A[RIGHT[i]]为根的两棵子树都是原创 2012-09-07 23:28:15 · 748 阅读 · 0 评论 -
排序----归并排序
1、归并排序 原理:假设初始序列有n个记录,则可以看成是n个有序的子序列,每一个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或者1的有序子序列;再两两归并......,如此重复,知道得到一个长度为n的有序序列为止。2、归并排序递归版本 递归将序列分行n个长度为1的子序列,然后递归将n各子序列排序成一个长度为n的有序序列。代码:#inclu原创 2012-09-12 15:05:12 · 761 阅读 · 0 评论 -
排序----快速排序
1、快速排序思想:选取基准元素,将数组分成两个子数组,其中一个数组里面的元素都比基准元素大,而另一个数组元素都比基准元素小。然后递归调用快速排序对这两个子数组进行排序。代码://快速排序//输入数组a,数组起始位置start(初始值0),结束位置end(初始值n-1)void QuickSort(int *a,int start,int end){ int i=start,原创 2012-09-07 23:54:56 · 831 阅读 · 0 评论 -
精选微软等公司数据结构+算法面试100题带答案(86-90)
86、怎样编写一个程序,把一个有序整数数组放到二叉树中? 分析:本题考察二叉搜索树的建树方法,简单的递归结构。关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。而学会把递归改称非递归也是一种必要的技术。毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。但是对某些数学问题,就一定要学会用递归去解决。struct BTree{ int data;转载 2012-09-03 15:22:33 · 2208 阅读 · 0 评论 -
图论----深度优先遍历和广度优先遍历
1、广度优先遍历原理: 广度优先遍历从某个顶点v出发,首先访问这个结点,并将其标记为已访问过; 然后顺序访问结点v的所有未被访问的邻接点{vi,..,vj},并将其标记为已访问过; 然后将{vi,...,vj}中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。具体代码实现时: 我们可以使用一个辅助队列q,原创 2012-09-09 17:25:26 · 3672 阅读 · 0 评论 -
海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
1、从set/map谈到hashtable/hash_map/hash_set 稍后本文第二部分中将多次提到hash_map/hash_set,下面稍稍介绍下这些容器,以作为基础准备。一般来说,STL容器分两种: 序列式容器(vector/list/deque/stack/queue/heap), 关联式容器。关联式容器又分为set(集合)和map(映射表)两大转载 2012-08-25 16:58:15 · 9625 阅读 · 4 评论 -
探索1+2+…+n的不同求解方法?
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 思路:通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。1、利用&&的短路性质,使用递归int add_fun(int n){ int sum=0; n && (sum=add_fun(n-原创 2012-09-05 17:52:01 · 2567 阅读 · 0 评论 -
从头到尾彻底解析Hash表算法
第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1转载 2012-08-26 10:20:01 · 1607 阅读 · 0 评论 -
海量数据面试题----Bloom Filter/Bitmap
1、Bloom Filter详解见下面的一篇文章 海量数据处理之Bloom Filter详解2、给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。 如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示4*(10^9)*8=340亿bit。 将其转载 2012-08-25 17:33:06 · 1958 阅读 · 0 评论 -
探索Fibonacci数列的最佳求解方法
1、定义Fibonacci数列如下: / 0 n=0 f(n) = 1 n=1 \ f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。 分析:在很多C语言教科书中讲到递归函数的原创 2012-09-04 21:28:09 · 1729 阅读 · 1 评论 -
2008!尾数有多少个0(因数2的个数大于因数5的个数)
1、2008!尾数有多少个零 其实就是遍历1到2008,求每个数包含的因数5的总个数#include#include #define NUM 2008//方法一int find5(int num){ int ret=0; while(num%5==0) { num/=5; ret++; } return ret;}原创 2012-08-03 18:14:08 · 1341 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
百度面试题目: 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数 22 ,如下图二元树: 10原创 2012-08-25 15:15:08 · 5624 阅读 · 3 评论 -
遗传算法原理与应用详解
遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 。 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。因此在介绍遗传算法前有必要简单的介绍生物进化知识。一.进化论知识 作为遗传算法生物背景的介绍,下面内容了解即可: 种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。 个体:组成原创 2012-08-26 10:58:03 · 3098 阅读 · 2 评论 -
海量数据处理之Bloom Filter详解
海量数据处理之Bloom Filter详解 前言 本博客内曾已经整理过十道海量数据处理面试题与十个方法大总结。接下来,本博客内会重点分析那些海量数据处理的方法,并重写十道海量数据处理的面试题。如果有任何问题,欢迎不吝指正。谢谢。一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个转载 2012-08-25 17:17:28 · 1607 阅读 · 0 评论 -
遗传算法原理与应用详解
遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 。 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。因此在介绍遗传算法前有必要简单的介绍生物进化知识。一.进化论知识 作为遗传算法生物背景的介绍,下面内容了解即可: 种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。 个体:组成原创 2012-08-26 11:00:49 · 1123 阅读 · 1 评论 -
栈的push、pop序列
栈的push、pop序列 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,pu原创 2012-09-07 16:24:59 · 1445 阅读 · 0 评论 -
圆圈中最后剩下的数字----Joseph环
圆圈中最后剩下的数字 n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。 分析1:很容易想到用循环链表。我们可以创建一个总共有n个数字的循环链表(不带头节点),然后每次从这个列原创 2012-09-07 16:26:00 · 3465 阅读 · 0 评论 -
统计在从1到n的正整数中1出现的次数
统计在从1到n的正整数中1出现的次数1、最直观的想法,求1到n中每个整数中1出现的次数,然后相加即可。而求每个十进制整数中1出现的次数,我们先判断这个数的个位数是否是1,如果这个数大于10,除以10之后再判断个位数是否为1,循环直至求出该整数包含1的个数。代码如下:#include "stdafx.h"#include "stdlib.h"#include #include原创 2012-09-07 16:23:36 · 14186 阅读 · 10 评论 -
栈----基本操作、进制转换和迷宫求解
//十进制数值M转换成m进制void SysConvert(int N,int m) { while(N!=0) { push(p,N%m); //将余数进栈 N=N/m; }}1、栈的基本操作// lb.cpp : Defines the entry point for the console application.//#include "stdafx.原创 2012-07-28 15:01:42 · 873 阅读 · 0 评论 -
二叉树----节点个数、高度、递归和非递归遍历、按层遍历
1、二叉树的数据结构(数据域+指向左/右孩子节点的指针) typedef struct tree { int data; struct tree *left; struct tree *right; }Tree,*pTree;2、创建二叉查找树//创建二叉树(二叉查找树),返回根节点pTree cr原创 2012-08-14 08:47:52 · 3961 阅读 · 0 评论 -
链表----增加删除节点、链表反转、链表合并
1、链表基本操作----(带头结点)链表创建、增加节点、删除节点、链表反转// lb.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdlib.h"#include #include using namespace std;//定义链表的数据结原创 2012-07-28 11:42:10 · 2854 阅读 · 0 评论 -
约瑟夫环
1、编号为1到N的N个人围着圆桌按序号坐着,从编号为1的人开始循环数数,数到M时对应的人离开座位,求最后剩下的那个人的编号?代码如下:#include "stdafx.h"#include #include //编号为1到N的N个人围着圆桌按序号坐着,从编号为1的人开始循环数数,数到M时对应的人离开座位,求最后剩下的那个人的编号#define M 4 #define N原创 2012-08-09 21:20:26 · 850 阅读 · 0 评论