算法
文章平均质量分 81
tianmo2010
这个作者很懒,什么都没留下…
展开
-
一致性hash算法详解
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的...转载 2011-09-30 20:01:52 · 1994 阅读 · 0 评论 -
从行,列均为递增的二维数组中查找给定元素
如题:设计算法bool Find(int *maxtrix, const int rows, const int cols, const int key){ if (maxtrix == NULL || rows < 0 || cols < 0) { return false; } bool found = false; int row = 0, col = cols原创 2013-09-17 12:23:09 · 1270 阅读 · 1 评论 -
常见算法和数据结构集合
巧填奇数阶幻方(魔方阵)[转]一、什么叫幻方?(通俗点说)把一些有规律的数填在纵横格数都相等的正方形图内,使每一行、每一列和每一条对角线上各个数之和都相等。这样的方阵图叫做幻方。幻方又分为奇数阶幻方和偶数阶幻方。奇数阶幻方是指横行、竖列都是单数(即3、5、7、9……)的方阵图。偶数阶幻方是指横行、竖列都是双数(即4、6、8、10……)的方阵图。二、奇数阶幻方的填法。奇数阶幻方中原创 2011-10-05 21:13:42 · 1029 阅读 · 0 评论 -
有道概率题:一个有趣的抛硬币问题
假设有一个硬币,抛出字(背面)和花(正面)的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现两次字为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出两个“字”向上游戏就结束了,不用继续抛。上面这个题目我第一次见到是在pongba的TopLanguage的一次讨论上,提出问题的人为Shuo Chen,当时我给出了一个解法,自认为已经相当转载 2013-09-15 23:03:59 · 3396 阅读 · 0 评论 -
阿里巴巴笔试题-2011年
例如已知数组a前半部分a[0,mid - 1],后半部分a[mid,num-1],现前半部分和后半部分均已排好序。要求:实现a数组的从小到大排序。空间复杂度为O(1).(百度笔试)#include void MergeIntData(int *a, const unsigned int num, const unsigned int mid){ if(mid < 0 || num转载 2011-09-11 13:33:11 · 1777 阅读 · 0 评论 -
一个骰子,6面,1个面是 1, 2个面是2, 3个面是3,问平均掷多少次能使1、2、3都至少出现一次。
题目:一个骰子,6面,1个面是 1, 2个面是2, 3个面是3,问平均掷多少次能使1、2、3都至少出现一次。解法一:(没学过《组合数学》的请略过)设P(N=n)表示第n次(n>2)抛出后1,2,3都出现的概率,问题要求n的期望E(N=n).掷1的概率p=1/6,掷2的概率q=1/3,掷3的概率r=1/2.//程序实例#include using namespace转载 2013-09-15 22:02:43 · 5904 阅读 · 0 评论 -
二叉树两个结点的最低共同父结点【算法】
题目:二叉树的结点定义如下:struct TreeNode{ int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。第 一变种是二叉树是原创 2011-09-23 20:21:41 · 1122 阅读 · 0 评论 -
数组前半部分和后半部分有序列的全排序
例如:已知数组a前半部分a[0,mid - 1],后半部分a[mid,num-1],现前半部分和后半部分均已排好序。要求:实现a数组的从小到大排序。空间复杂度为O(1).#include using namespace std;void PrintArry(int v[],int len){ for(int i = 0; i < len; i ++)原创 2013-09-13 15:55:33 · 2109 阅读 · 0 评论 -
循环移位算法
将一个含有n个元素的数组向右循环移动k位,要求时间复杂度是O(n),且只能使用两个额外的变量,这是在微软的编程之美上看到的一道题分析:比如数组 1 2 3 4循环右移1位 将变成 4 1 2 3, 观察可知1 2 3 的顺序在移位前后没有改变,只是和4的位置交换了一下,所以等同于1 2 3 4 先划分为两部分1 2 3 | 4,然后将1 2 3逆序,再将4 逆序 得到 3 2 1 4,原创 2013-07-22 20:08:29 · 5072 阅读 · 0 评论 -
抽奖程序
一、int rand()可以生成从[0, 65536)之间均匀分布的随机数。现要求实现:有30万员工,使用rand()写一个抽奖程序,抽出人100获奖。#include #include using namespace std;typedef set ISET;ISET GetPridePersonId(const int num, const int pride_num)原创 2013-08-19 15:37:44 · 1860 阅读 · 1 评论 -
将数组里的负数排在数组的前面,正数排在数组的后面。但不改变原先负数和正数的排列顺序。
题目描述:将数组里的负数排在数组的前面,正数排在数组的后面。但不改变原先负数和正数的排列顺序。例:input: -5,2,-3, 4,-8,-9, 1, 3,-10;output: -5, -3, -8, -9, -10, 2, 4, 1, 3。算法描述:①设定两个计数器begin、end,其中begin始终指向数组中的第一个负数,end始终指向位于begin之后的第一个正数。然后把b原创 2013-06-22 19:47:42 · 7873 阅读 · 1 评论 -
数组中最长的区间,满足该区间内的数排序后是连续的。
题目:数组中最长的区间,满足该区间内的数排序后是连续的。比如,[23, 4,1,3,2,9,8,24] 4,1,3,2 是最长区间,是连在一起的。[23, 1,3,2,9,4,8,24] 就只能返回1,2,3了。算法描述:①从x0开始,找length=|x0-x1|+1内的max和min,length大于数列长度则否定x0,再从x1向后开始找;1_如果max-min+1=length,原创 2013-06-17 14:07:30 · 1620 阅读 · 1 评论 -
实现sqrt和pow函数
方法一、一个采用牛顿迭代法的函数double sqrt(double number) { if(number<=0)return 0; //设置初始值i,i值越接近sqrt(number),所需循环次数越少 double i = 1; //一个快速算法是:int exp;double i=ldexp(frexp(number,&exp),(原创 2013-09-16 23:47:00 · 3163 阅读 · 0 评论 -
查找数组中第二大或者第二小的数值
1、从一个给定的、无序的数组中,找出第二大的数值。#include int FindSecondBiggest(int *v, int len){ if (v == NULL || len < 2) { return 0xfffffff; } int i, max = v[0], second = v[1]; for (i = 2; i < len; ++ i) {原创 2013-10-08 09:33:07 · 4864 阅读 · 1 评论 -
求两个数组的交集、并集和差集算法分析与实现
一、数组内数据无序且可以重复本文采用一种交换的方式来求出两个数组的并集,交集和差集,这种算法运算速度较快,内存消耗空间较少,是一个值得学习的好方法,另外,作者提醒您,重要的不是算法本身,而是该算法会开拓我们的思维空间,要注意对问题的多思考。 算法概述:两个任意元素的数组,比较出两个数组中相同的元素和不同的元素。 元素划分:计算过程中,两个原创 2013-06-05 17:02:11 · 12916 阅读 · 1 评论 -
打散函数的事项
打散函数的实现方法一:void RandomShuffle(std::vector<std::string>& vecs) { for (uint32_t i = 0; i < vecs.size(); ++i) { srand((unsigned)time(NULL)); const uint32_t slot = rand() % v...原创 2018-02-08 11:33:17 · 2619 阅读 · 0 评论 -
根据给定的某个Sum,从数组中找出3个和为该Sum(三个数的和)
原题 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet原创 2012-08-20 14:25:37 · 6978 阅读 · 1 评论 -
数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。对二进制的操作很多人都不是很熟悉,因此编码可能觉得有些难度。我们可以换一种思路考虑:我们要求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次转载 2012-08-21 15:44:50 · 1041 阅读 · 0 评论 -
根据给定的某个Sum,从数组中找出4个和为该Sum(四个数的和)
原题 Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: E原创 2012-08-21 14:29:09 · 3077 阅读 · 0 评论 -
全排列和组合的实现算法
一 全排列算法原理和实现全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3原创 2011-12-02 14:48:07 · 2096 阅读 · 0 评论 -
Top K问题
Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如:从20亿个数字的文本中,找出最大的前100个。 解决Top K问题有两种思路,最直观:小顶堆(大顶堆 -> 最小100个数);较高效:Quick Select算法。 1. 堆 小顶堆(min-heap)有个重要的性质——每个结点的值均不大于其左右孩子结点的值,则堆顶元素即为整个堆的...原创 2012-03-25 17:55:48 · 2372 阅读 · 1 评论 -
二分查找—lower_bound 、upper_bound 、binary_search
STL中关于二分查找的函数有三个lower_bound 、upper_bound 、binary_search 。这三个函数都运用于有序区间(当然这也是运用二分查找的前提)。 其中如果寻找的value存在,那么lower_bound返回一个迭代器指向其中第一个这个元素。upper_bound返回一个迭代器指向其中最后一个这个元素的下一个位置(明确点说就是返回在不破坏顺序的情况下原创 2013-08-19 17:04:15 · 1418 阅读 · 0 评论 -
AC算法
AC算法是Alfred V.Aho(《编译原理》(龙书)的作者),和Margaret J.Corasick于1974年提出(与KMP算法同年)的一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,...pm},在O(n)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关。正如KMP算法在单模式匹配方面的突出贡献一样,AC算法对于多模式匹配算法后续的发原创 2012-12-25 19:57:58 · 1563 阅读 · 0 评论 -
QuickSort详解与算法实现
算法过程 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快速排序的算法是: 1)设置两个变量I、J,排序开始原创 2011-08-16 16:40:27 · 1278 阅读 · 0 评论 -
找出一堆数里面出现次数最多或最多的前N个数字
描叙:一大推数据里面,数字与数字之间用空格隔开,找出出现次数最多的前N个。#当数字之间的空格只有一个的时候#sed 's/ /\n/g' data.txt | sort | uniq -c | sort -k1n -k2n | tail -10 > result.txt #存在的问题,当出现次数为第10的时候,与该次数可能有多个?#解决方案:按照降序排列,找出第10行,并且原创 2012-04-26 15:44:50 · 5915 阅读 · 1 评论 -
腾讯:根据A数组求B数组值(要求时间、空间复杂度)
/*** Analysis:** b[0] = a[1]*a[2]...*a[N-1] * b[3] = a[0]*a[1]*a[2] * a[4]*...*a[N-1]* b[4] = a[0]*a[1]*a[2]*a[3] * a[5]*...*a[N-1]** b[i] = a[0]*a[1]*a[i-1] * a[i+1]*...*a[N-1]** b[i] = Ci *原创 2013-04-21 14:59:27 · 1457 阅读 · 0 评论 -
二分查找算法的实现
输入一个长度为length的有序整数数列numbers,和要查找的整数key;如找到则返回该数载数列中的位置,否则返回-1,函数声明如下int BinarySearch(const int* numbers, int length, int key);int BinarySearch(const int *a, const int len, const int key){ if ((N原创 2011-08-15 12:52:45 · 991 阅读 · 0 评论 -
《编程之美》2.12 快速寻找满足条件的两个数(预排序)
题目: 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。解法:思路1: 暴力穷举O(n^2)思路2: 对数组预排序O(NlogN),然后遍历该数组,对每一个数a,都进行查找Sum-a在不在数组中。这种查找在二分查找下需要O(logN转载 2013-04-10 23:17:05 · 1405 阅读 · 0 评论 -
KMP 算法详解
KMP 是字符串匹配的经典算法,曾经一度对其敬而远之,感觉很难写出来正确的 KMP 算法,这都是拜那些“教科书”所赐,在它们的教授下,不禁感觉 KMP 很难!其实理解 KMP 算法很简单,今天就来看个究竟,我的目标就是从几个简单的数学等式推导出 KMP 算法,简单但严谨。串匹配先来回忆一下串匹配场景,不外乎是给定两个字符串 S 和 T ,然后在 S 串中查找 T 串,如果查找成功就是匹原创 2012-02-16 20:46:27 · 771 阅读 · 0 评论 -
数对之差的最大值【算法】
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。分析:看到这个题目,很多人的第一反应是找到这个数组的最大值和最小值,然后觉得最大值减去最小值就是最终的结果。这种思路忽略了题目中很重要的一点:数对之差是一个数字减去它右边的数字。由于我们无法保证最大值一定位于原创 2011-08-19 16:43:15 · 1317 阅读 · 0 评论 -
大数的阶乘
大数的阶乘/*时间限制:3000 ms | 内存限制:65535 KB难度:3描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50样例输出 304140932017133780436126081660647688443原创 2012-04-07 19:09:08 · 1687 阅读 · 0 评论 -
STL中map按值(value)排序
map默认是按照键(key)排序的。很多时候我们需要按值(value)排序,靠map里的算法当然是不行的,那么可以把它转存到vector中,在对vector按照一定的规则排序即可。//示例代码:输入单词,统计单词出现次数并按照单词出现次数从多到少排序 #include #include #include #include #include #include原创 2012-05-03 21:14:09 · 1749 阅读 · 0 评论 -
求数组中和最大的子数组【算法】
【题目一】输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。#include "stdio.h"#include "conio.h"/* 求一维数组的最大连续子数组元素之和 入口 : A 要计算的一维整数数组 出口 : iFrom , iTo , iMaxSum原创 2011-10-01 19:38:49 · 1457 阅读 · 0 评论 -
整数的二进制数中1的数目,1-N中1的总共个数,如何判断一个数是否为2的整数次幂.
①题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基括微本的考查位运算的面试题。包软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问原创 2011-08-23 18:45:31 · 1617 阅读 · 0 评论 -
每两个字符截取,读取配置文件
每两个字符截取,再此基础上做一系列的出来#include #include #include int main(){ int i; char intermediate[3] = {0}; char ptr[] = "00142A8F606F"; for (i = 0; i < strlen(ptr); i += 2) {原创 2011-12-16 21:57:38 · 756 阅读 · 0 评论 -
任意一棵二叉树中最大距离的两个节点【算法】
//后序 求 每个节点最远距离, 倒着遍历, 只遍历了一遍 O( N )//如果从上往下遍历 则 O( N*N ) int GetMaxPathLen( Node* root, int& maxLen ) //maxLen初始值传0{ //别用 全局变量(存在线程安全问题) if ( NULL == root ) return 0; int left = GetM...原创 2012-01-13 15:25:14 · 1695 阅读 · 0 评论 -
两个或N个字符串最大公共子串算法
在版里看到有人问最大公共字串的问题,自己学习后在这里将总结发出来。最大公共字串分为两类,一类是我们大家所熟知的两个字符串的最大公共子串,另一个是我在搜索中发现的就是N个字符串的最大公共字串问题。首先来看两个字符串的最大公共字串问题。这里我列出了两种解法,第一种就是暴力解法,第二种是动态规划来解的。还有一种解法就是我们数据结构书上会降到的KMP匹配算法,这里我没给出。 第一种:暴转载 2012-04-18 15:14:56 · 1838 阅读 · 0 评论 -
关于位运算的重要应用
1. 位运算:向左每移动一位,相当于乘以2;向右每移动一位,相当于除以2; 2.交换两个变量,不准用临时变量,不用额外空间。如a=3,b=4;具体实现的代码:a = a ^ b;//异或b = b ^ a;a = a ^ b;3.int add(int a, int b)//函数实现加法运算//函数内不能使用+-*/符合,也不能用循环语句.int add(int a,原创 2011-10-01 19:46:36 · 925 阅读 · 0 评论 -
关于从大量数据中查找唯一数据的几个问题
常见的问题有以下几类:问题一.有101个数,为[1,100]之间的数,其中一个数是重复的,如何寻找这个重复的数,其时间复杂度和空间复杂度是多少?方法:利用和sum1=1+2+3+.....99;sum2=a[0]+a[1]+.....a[99];sum2-sum1=重复的那个值int OnlyOneRepeate(int *iArray,int length){原创 2012-02-28 16:43:23 · 1693 阅读 · 0 评论 -
数字,字符串的从尾到头的输出
一 链表的从尾到头输出#include "stdio.h"#include "malloc.h"struct ListNode { int m_nKey; ListNode* m_pNext; }; ///////////////////////////////////////////////////////////////////原创 2011-08-20 14:09:50 · 1664 阅读 · 0 评论