
【算法】
小田
无人扶我青云志,我自踏雪向山巅。倘若命中无此运,孤身亦可登昆仑。他朝若有翻身时,生吃黄莲也叫甜。
展开
-
【100题】第一题
1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。首先我们定义的二原创 2011-11-30 00:20:17 · 1303 阅读 · 3 评论 -
【算法】从头到尾彻底解析hash 表算法
说明:本文分为三部分内容,第一部分为一道百度面试题Top K算法的详解;第二部分为关于Hash表算法的详细阐述;第三部分为打造一个最快的Hash表算法。------------------------------------第一部分:Top K 算法详解问题描述百度面试题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。转载 2011-11-29 23:10:46 · 1789 阅读 · 6 评论 -
【100题】第二题
2.设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:既然要求“求最小”时间复杂度为O(1) ,所以一定要在top指针结构内记录最小量。就是在push 时将最小值 #include "stdio.h"#include"malloc.h"#define STACK原创 2011-12-02 00:09:29 · 1255 阅读 · 0 评论 -
【算法导论】拓扑排序
拓扑排序一,邻接表(无前驱实现)该方法的每一步总是输出当前无前趋(即入度为零)的顶点 其抽象算法可描述为: NonPreFirstTopSort(G){//优先输出无前趋的顶点 while(G中有入度为0的顶点) do{ 从G中选择一个入度为0的顶点v且输出之;(栈顶弹出)原创 2011-12-05 11:32:29 · 4061 阅读 · 2 评论 -
【100题】第十题(翻转句子中的单词)
题目:输入一个英文句子,翻转句子中单词的顺序,单词内字符的顺序不变。 句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例子:输入“I am a student.”,则输出“student.a am I”。总体思想:根据字符串中的' '将切割出每一个单词,然后倒置顺序,最后将整个字符串倒置。C++源码:#include#includeu原创 2011-12-18 00:07:19 · 2228 阅读 · 0 评论 -
【100题】第九题(整数序列是否是二叉查找树后续遍历)
判断整数序列是不是二叉查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 如果是返回true,否则返回false。例如:输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历(左右根)结果: 8 / \ 6 10 / \ /原创 2011-12-14 00:28:39 · 1822 阅读 · 0 评论 -
【100题】第六题
腾讯面试题: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0在下排出现了6次,原创 2011-12-04 23:57:11 · 1114 阅读 · 1 评论 -
【算法导论】最小生成树(prim算法)
一,定义: 没有权值时:一个有n个节点的联通图,生成树是,极小联通子图。包含图中所有节点,且有保持图联通的最少的边。 边有权值时:无向联通图G=(V,E),权值函数,w:E->R。找到G的一棵最小生成树,使得 w(T)最小。w(T)为最小生成树所有边权值和。二,prime算法 1:初始化:U={u 0},TE={f}。 节点集U=0,边集T原创 2011-12-06 00:15:08 · 3193 阅读 · 0 评论 -
【算法导论】最小生成树扩展
一,次最小生成树 定义:设T是图G的最小生成树,如果T1满足ω(T1)=min{ω(T’)| T’∈Not(T)},则T1是G的次小生成树。 解释:除了最小生成树外,另外一个生成树的权值和最小的生成树,定义为次最小生成树。 经典题目:POJ1679 The Unique MST,对于一张图,判断最小生成树是否惟一。惟一的定义是:不存在第二棵生原创 2011-12-12 23:52:17 · 2689 阅读 · 0 评论 -
【100题】第十三题(输出倒数第k个节点)
一,题目:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。二,分析:这是某一年的考研试题中,数据结构的一个题。题目本身难度不大。三,思路:设置两个指针p1,p2; p1=head; p2=head; 先让p2向前走k步,然后同时让p1,p2向后走。原创 2011-12-28 00:40:24 · 1625 阅读 · 0 评论 -
【100题】第十四题(数组中找两个数使其和等于输入数)
一,题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。二,题目难点在于时间复杂度控制在O(n)三,方法一 1,分别从数组前,数组后向中间查找。直到前后相遇!原创 2012-01-10 00:11:48 · 2312 阅读 · 1 评论 -
【100题】第十五题(树的镜像问题)
一,题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / \ 6 10 / \ / \ 5 7 9 11 输出原创 2012-02-22 16:27:37 · 1170 阅读 · 0 评论 -
【100题】第十六题(层序打印树的节点)
一,题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入 8 / \ 6 10 / \ / \5 7 9 11输出:8 6 10 5 7 9 11。二,分析: 本题主要考察树的层序遍历,最常用的方法就是采用队列的形式。原创 2012-02-22 17:32:21 · 1530 阅读 · 0 评论 -
【100题】第十九题(斐波那楔数列)
一,题目:输入n用最快的方法求Fibonacci数列的第n项。二,定义:Fibonacci数列如下: 0 n=0f(n)= 1 n=1,2f(n-1)+f(n-2) n>2//0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 9871597..原创 2012-02-25 22:42:47 · 2368 阅读 · 1 评论 -
【算法导论】第二十六章最大流
一,概念 1)流网络:简单有向图,且有两个特别的顶点(源点s,汇点t) 2)流的边标识为f(u,v)/c(u,v),流量/容量 3)流的三个性质:1>容量限制 对于所有边 流量 2>反对称性 f(u,v)=-f(v,u)原创 2012-03-09 19:50:44 · 2134 阅读 · 0 评论 -
【算法导论】图的创建,深度优先访问,广度优先访问(递归/非递归)
这里仅仅贴出来我调试好的代码……更详细的解释在代码注释中。 #include "stdio.h"#include "malloc.h"#define MaxSize 10#define MaxValue 99999/*邻接表 :Adjacency list*/typedef struct ArcNode //边 表节点 { int adjvex;//原创 2011-12-04 11:34:53 · 1258 阅读 · 0 评论 -
【算法导论】第二十七章 排序网络
一,比较网络 1)组成:线路和比较器 2)比较网络含义:就是一个由线路互相联接着的比较器的集合,我们把具有n个输入的比较网络画成一个由n条水平线组成的图,比较器则垂直地与两条水平线相连接。每个比较器的输入端要么与网络的n条输入线路a1,a2,……,an中的一条相连,要么与另一个比较器的输出端相连接。类似地,每个比较器的输出端要原创 2012-03-14 00:12:30 · 7950 阅读 · 1 评论 -
【算法导论】贪心算法,递归算法,动态规划算法总结
一般实际生活中我们遇到的算法分为四类:一>判定性问题二>最优化问题三>构造性问题四>计算性问题而今天所要总结的算法就是着重解决 最优化问题 《算法之道》对三种算法进行了归纳总结,如下表所示: 标准分治动态规划贪心算法适用类型通用问题优化问题优化问题原创 2011-11-29 23:24:44 · 2576 阅读 · 0 评论 -
【算法导论】指针作为形式参数时 改变指针所指的值(二叉排序树)
例题一:让原本指向空的两个指针,赋值#include"stdio.h"#include"malloc.h"#include"string.h"void TestFunction(char** ptr1, char*& ptr2)//我经常喜欢用 *&ptr2{*ptr1 = "abc";ptr2 = (char*)malloc(6);strcpy(ptr2, "ab原创 2011-11-29 23:26:27 · 1003 阅读 · 0 评论 -
【算法导论】双调欧几里得旅行商问题
首先,庆贺一下自己解决了(看懂了传说中的niubility的旅行商问题)其次,马上要看到著名的贪心算法问题了!心中无比的激动。旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出)J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地原创 2011-11-29 23:25:11 · 1661 阅读 · 0 评论 -
【100题】第三十六 比赛淘汰问题(谷歌笔试)
一,题目:(谷歌笔试) n支队伍比赛,分别编号为0,1,2……n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。原创 2012-04-24 09:09:59 · 3407 阅读 · 1 评论 -
【100题】第三十四 实现一个队列
一,题目: 生产者消费者线程演示 一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列 二,分析: 这一个,为操作系统上的一个经典例子,以下是july给出的解答 三,源码:#include #include #includ原创 2012-04-22 23:14:27 · 1281 阅读 · 0 评论 -
【100题】第二十二 推理题
题目:有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌(每人头上贴两张) A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌, A说不知道,B说不知道,C说不知道,然后A说知道了。 请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?思原创 2012-04-12 00:53:04 · 1787 阅读 · 0 评论 -
【100题】第二十四 反转链表
题目:新建一个链表,然后反转一下#include #include using namespace std;struct node{ int data; node *next;};void insert(node *root,node *p){ p->next=root->next; root->next=p;}node *create(int a[],int n)原创 2012-04-15 23:42:30 · 2117 阅读 · 0 评论 -
【100题】第二十五 找连续最长数字串
一,题目 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) 功能: 在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串赋给其中一个函数参数outputstr所指内存。 例如:"abc原创 2012-04-17 09:44:59 · 2082 阅读 · 0 评论 -
【100题】第二十六 左旋转字符串
一,题目:(本题为某年考研试题) 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。二,分析:如果不考虑时间和空间复杂度的限制,原创 2012-04-17 12:40:28 · 1952 阅读 · 0 评论 -
【100题】第二十八 整数的二进制表示中1的个数
一,题目:输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。二,分析: 这是一道很基本的考查位运算的面试题。 菜鸟思考:利用除法,和取余运算计算出10进制数的二进制表示后,统计1的个数三,代码自己测试代码(感觉没问题)#include usin原创 2012-04-17 20:50:47 · 2011 阅读 · 0 评论 -
【算法】平摊分析
平摊分析种类1),聚集分析:n个操作所构成的序列的总时间在最坏情况下为T(n) 平摊代价为:T(n)/n2),记账法:平摊代价高的操作,当做存储,用来补偿平摊代价低得操作。3),势能法:平摊代价=实际代价+i点的势能-(i-1)点的势能平摊分析总结平摊分析可用来证明在一系列操作中,即使单一的操作具有较大的代价,通过对所有操作求平均后,平均代价还是很小的。平摊分析与平均情况分析的原创 2011-11-29 23:22:29 · 1387 阅读 · 2 评论 -
【100题】第二十七 跳台阶问题
一,题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少种跳法,并分析算法的时间复杂度。二,分析:如果有1级台阶,那显然只有一种跳法。 如果有2级台阶,那就有两种跳的方法了:每次跳1级;一次跳2级。 现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。原创 2012-04-17 18:49:44 · 1962 阅读 · 0 评论 -
【100题】第三十七 字符串连接问题
一,题目: 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。二,分析: 将各个字符串作为一个节点,首尾链接就好比是一条边,将两个节点连接起来,于是问题就变成一个有关图的路径长度的问题。链接所得的字符串最长长度即为从图的某个节点出发所能原创 2012-05-01 23:14:55 · 1078 阅读 · 0 评论 -
【100题】第二十九 栈的push、pop序列
一,题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。 如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可; 如果希望pop的数字目前不在栈顶,我们就到push序列中还没有被push到栈里的数字中去搜索这个数字,并把在它之前的所有数字都push进栈。原创 2012-04-18 23:54:40 · 2167 阅读 · 0 评论 -
【算法复习一】常见的算法策略汇总
一,概述 算法策略和算法是有区别的,它们是算法设计中的两个方面,算法策略是面向问题的,算法是面向实现的; 但二者又是不可分的,首先是通过算法策略才找出解决问题的算法,其次对于用不同算法求解的问题算法策略是自然不同的。二,算法策略 1)递推策略:“递推法”和贪心算法一样也是由当前问题的逐步解决从而得到整个问题的解原创 2012-05-03 09:51:56 · 3774 阅读 · 1 评论 -
【算法复习二】传统基本算法(迭代、递归、分治)
一,迭代与递推 1)迭代法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。例如:斐波那契数列 例子:兔子繁殖问题 一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下原创 2012-05-03 16:55:05 · 2681 阅读 · 0 评论 -
【算法复习二】传统基本算法(分治----残缺棋盘问题)
• 问题描述: 残缺棋盘是一个有2k×2k(k≥1)个方格的棋盘,其中恰有一个方格残缺。如图给出k=1时各种可能的残缺棋盘,其中残缺的方格用阴影表示。• 残缺棋盘问题就是要用这四种三格板覆盖更大的残缺棋盘。在此覆盖中要求: 1)两个三格板不能重叠 2)三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。原创 2012-05-03 18:51:19 · 9600 阅读 · 0 评论 -
【100题】第三十 求从1到n这n个整数的十进制表示中1出现的次数
一,题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入n=12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。二,分析:这是一道广为流传的google面试题。 我们每次判断整数的个位数字是不是1。如果这个数字大于10,除以10之后再判断个位数字是不是1。三,原创 2012-04-19 00:46:49 · 1643 阅读 · 2 评论 -
【100题】第三十二 数组、规划
一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如: var a=[100 ,99 ,98 ,1 ,2 ,3]; var b=[1, 2, 3, 4, 5, 40]; 有两个序列a,b,大小都为n,序列元素的值原创 2012-04-20 11:31:06 · 3838 阅读 · 8 评论 -
【算法复习二】传统基本算法(贪心、动态规划、回溯和分支限界)
一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第原创 2012-05-04 17:08:18 · 4200 阅读 · 0 评论 -
【算法复习二】货郎担(旅行售货商)动态规划
一,问题由来 货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。 二,问题描述 1)货郎担问题提法:有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短?原创 2012-05-04 15:25:42 · 27545 阅读 · 6 评论 -
【算法复习二】八皇后问题 ---- 回溯
一,问题描述 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 二,分析 采用逐步试探的方式,先从一个方向往前走,能进则进,不能进则退并尝试另外的路径。首先我们来分析一下国际象棋的规则,这些规则能够限制我们的前进,也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足以下条件的皇后q原创 2012-05-04 16:49:54 · 11007 阅读 · 1 评论 -
【算法复习四】计算复杂性与算法分析---组合数学知识汇总
一,组合数学问题 1)排列定义 • 从n个不同的元素中,取r个不重复的元素,按次序排列,称为从n个中取r个的无重排列。 •排列的全体组成的集合用P(n,r)表示。当r=n时称为全排列。 组合定义 • 定义从n个不同元素中取r个不重复的元素组成一个子集,而原创 2012-05-06 21:08:21 · 1774 阅读 · 0 评论