
Algorithm
文章平均质量分 73
luxiaoxun
拒绝平庸,但也不指望什么奇迹!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
排列组合问题
排列:从n个不同元素中,任取m(m 组合:从n个不同元素中,任取m(m#include using namespace std;#define MaxN 10char used[MaxN];int p[MaxN];char s[MaxN];//从n个元素中选r个进行排列void permute(int pos,const int n,const i原创 2012-08-08 13:59:42 · 1013 阅读 · 0 评论 -
寻找最大的k个数,TopK问题的C++实现
2亿个整数中求最大的100万之和题目:有一个文件中保存了2亿个整数,每个整数都以' '分隔。求最大的100万个整数之和。算法:1. 首先建立一个容量为100万(nTop)的int数组,从文件读取整数填充。2. 利用堆维护该100万条记录(确保堆顶元素为最小值)3. 从文件中读取一个整数与堆顶元素比较,如果大于堆顶元素则替换该元素,并调整堆的结构。4. 重复步骤3一直到数据读原创 2012-07-28 12:02:21 · 9069 阅读 · 0 评论 -
编程之美--数字之魅
读《编程之美》数字之魅部分的笔记。1、整型数V的二进制中1的个数:int Count(int v){ int num = 0; while(v) { num += v & 0x01; v >>= 1; } return num;}int Count(int v){ int n原创 2012-07-12 14:55:56 · 1439 阅读 · 0 评论 -
等概率随机函数的实现
利用等概率函数Rand5产生等概率函数Rand3问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数。//使用Rand5()实现Rand3()int Rand3(){ int x; do原创 2012-09-06 14:34:41 · 3334 阅读 · 2 评论 -
背包问题
P01: 01背包问题 题目:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v] = max{ f[i-1][v],原创 2012-09-20 19:55:08 · 3320 阅读 · 1 评论 -
卡特兰数 Catalan number
卡特兰数 Catalan number卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 914825636原创 2012-10-01 10:23:59 · 5137 阅读 · 0 评论 -
二分搜索及其扩展
二分搜索折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:二分搜索每次把原创 2012-10-01 15:48:19 · 3422 阅读 · 0 评论 -
求字符串中最长无重复字符的子串
题目:求一个字符串中最长的没有重复字符的子串。方法一:穷举法,使用2重外循环遍历所有的区间,用2重内循环检验子串是否符合“无重复字符”这一要求。其中外层循环i、j 遍历所有的下标,m、n是内层循环,检查区间[i,j]是否符合要求。空间复杂度是O(1),时间复杂度O(N^4)。//O(N^4)的时间复杂度int max_unique_substring1(char * str){原创 2012-10-02 13:25:06 · 17313 阅读 · 2 评论 -
有序数组中找中位数
原文:Median of two sorted arrays题目:两个有序数组A和B,大小都是n,寻找这两个数组合并后的中位数。时间复杂度为O(logn)。中位数:如果数组有个数是奇数,那么中数的值就是有序时处于中间的数;如果数组个数是偶数的,那么就是有序时中间两个数的平均值。方法一:合并时计数使用Merge Sort时的Merge操作,比较两个数组时候计数,当计数达到n时,就可以翻译 2012-09-09 14:54:09 · 4377 阅读 · 0 评论 -
后缀数组--处理字符串的利器
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。子串:字符串S的子串r[i..j],i后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串 s 的从第i个字符开始的后缀表示为Suffix(i), 也就是Suffix(i)=r[i..len(s原创 2012-10-05 12:44:28 · 3325 阅读 · 0 评论 -
O(N)的时间寻找最大的K个数
寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数。可以使用二分搜索的策略来寻找N个数中的第K大的数。对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数。寻找第k大的元素:#include using namespace std;//快速排序的划分函数int partition(int a[],int l,int r){原创 2012-08-07 11:45:28 · 2976 阅读 · 0 评论 -
单源最短路径算法--Dijkstra算法和Bellman-Ford算法
Dijkstra算法算法流程:(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。特点:总是按照从小到大的顺序求得最短路径。假原创 2012-08-03 20:58:07 · 1733 阅读 · 0 评论 -
最短路径Bellman-Ford算法
Bellman-Ford算法思想Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题。对于给定的带权(有向或无向)图 G=(V,E),其源点为s,加权函数 w 是边集 E 的映射。对图G运行Bellman-Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到图G的任意顶点v的最短路径d[v]。原创 2012-04-09 13:37:59 · 1500 阅读 · 0 评论 -
找出数组中两个只出现一次的数
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次原创 2012-04-08 18:24:21 · 1408 阅读 · 0 评论 -
正整数分解为几个连续自然数之和
题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:15=1+2+3+4+515=4+5+615=7+8有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5;有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢?一个数M若可以写成以a开头原创 2012-04-21 21:44:59 · 6174 阅读 · 0 评论 -
最大子序列和问题
问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。原创 2012-04-08 18:33:00 · 25477 阅读 · 13 评论 -
八数码问题及A*算法
八数码问题一.八数码问题八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问原创 2012-06-04 08:17:58 · 15742 阅读 · 3 评论 -
Base64算法及C++实现
Base64用途1.用于对SOHO级路由器(网关设备)管理员帐户密码的加密2.流媒体网站对于播放的流媒体文件的路径的加密3.迅雷等下载软件对下载链接地址的加密Base64算法Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。Base64类原创 2012-06-07 11:50:20 · 7269 阅读 · 0 评论 -
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于本题原创 2012-04-20 16:13:00 · 634 阅读 · 0 评论 -
计算字符串的相似度
问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdefg”和“abcdef”原创 2012-04-24 15:04:06 · 5949 阅读 · 2 评论 -
会场安排问题
会场安排问题问题描述:假设要在足够多的会场里安排一批活动,活动的开始时间和结束时间已知,并希望使用尽可能少的会场。设计一个有效的算法进行安排。分析:这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,就对应要找的最小会场数。 图的最少着色问题,至今没有有效的算法,但这个问题和图的着色问题有不同,活动的时间区间之间的约束原创 2012-08-07 10:07:01 · 1336 阅读 · 0 评论 -
二分查找法及其扩展运用
二分查找可以解决排序数组的查找问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过logN次比较。 二分搜索需要注意开闭区间的问题,限原创 2012-09-02 15:24:15 · 3823 阅读 · 0 评论