
Algorithms
chfe910
这个作者很懒,什么都没留下…
展开
-
动态规划算法
动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。与分治法不同的是,动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中。动态规划通常应用于最优化问题。动态规划算法的设计可以分为如下4个步骤:描述最优解的结构;递归定义最优解的值;按自底向上的方式计算最优解的值;由计算结果构造一个最优解。第1~3步构成问题的动态规原创 2014-11-01 11:36:48 · 802 阅读 · 0 评论 -
面试题[堆排序]: 二维数组的Top(N)
题目:一个二维数组,每一行都是升序排列的,但每一列每一列并不一定是升序排列的,设计算法找出最大的N个数。这类Top(N)算法,很容易想到堆排序,那么建什么堆呢?建多大的堆呢?这个题目有个特点就是矩阵的最后一列是每一行的最大元素,那么整个矩阵的最大元素必然也在最后一列,所以我们可以考虑将最后一列元素建一个大根堆,建好之后,堆顶就是目前最大的元素,pop出最大的元素之后,将该最大元素的所在行的前一个元原创 2015-03-23 20:10:02 · 2120 阅读 · 0 评论 -
面试题[数学与概率]: 从数据流中随机选取样本
题目:输入一段int型数据流,输入未完成之前并不知道数据流的长度,要求在O(1)空间复杂度的前提下随机选出一个元素,并保证每一个元素被选中的概率是一样的。我的解法如下:假如输入的数据流依次是10、20、30、40、……收到10时:以概率1选择10; 收到20时:以概率1/2选择10,以概率1/2选择20; 收到30时:以概率2/3选择上一次选到的元素,以概率1/3选择30;...原创 2015-03-23 20:21:01 · 1659 阅读 · 0 评论 -
面试题[后缀数组]: 最长重复子串
题目:给定一个字符串,求出最长重复子串。这个题目可以用后缀数组来解:对后缀数组排好序,这样重复的子串就在相邻的后缀中找就可以了。我的C++代码实现如下:class Solution{public: string LongestRepeatingSubstring(string str) { size_t len = str.size(); vec原创 2015-03-31 19:26:21 · 947 阅读 · 0 评论 -
统计起始日期之间有多少个2月29日
题目:统计起始日期之间有多少个2月29。#include <iostream>#include <string>using namespace std;class Date{private: int month; int day; int year; static int getMonthFromString(const string &s) {原创 2015-04-19 23:50:12 · 1304 阅读 · 0 评论 -
面试题:旋转数组
这是搜狐2015年实习生招聘研发岗位笔试的第一道编程题. 题目描述:输入一个数组,将其循环旋转k个位置,要求时间复杂度为O(N),空间复杂度越低越好.以一个例子来说明: 初始数组: 1,2,3,4,5 k=2 首先倒置整个数组:5,4,3,2,1 然后倒置前k个:4,5,3,2,1 然后倒置后面剩下的:4,5,1,2,3 以上得到的结果即为所求.代码实现如下:void revers原创 2015-04-16 21:17:14 · 839 阅读 · 0 评论 -
判定两个集合是否相同
寻找合适的算法判定两个集合是否相同,要求时间复杂度为O(N),空间复杂度为O(1),集合中的元素有可能是int,也有可能是string等。解决方法:计算着每个集合所有元素的信息指纹(MD5或者SHA1算法),然后累加起来,判定两个和是否相等,若相等则集合相同,否则集合不同。原创 2015-04-20 18:18:22 · 3884 阅读 · 0 评论 -
[面试题] 用最快的方法找到唯一一个不连续成对出现的字母
面试题:除了某一个字母以外,其他字母都是连续成对出现的,比方说“AABBCCDDEFFGGHH”,用最快的方法找到其中的“E”。思路:最快的方法肯定不是顺序遍历整个字符串,因为那样做的时间复杂度是O(n)。仔细观察这个字符串,实际上是很有规律的,前面正常成对出现的字母存在这样一个规律——偶数下标的字母必然与它的下一个字母相同,后半部分正常出现的字母也存在一个规律——奇数下标的字母必然和它的下一个字母原创 2017-08-23 20:09:07 · 863 阅读 · 0 评论 -
面试题[hash_map、字典树与倒排索引]: 全文检索
原始题目 给定一篇英文文献,然后查某个单词在这篇文章中出现了多少次(忽略大小写)。注意这个查找会出现很多次,每一次查不同的单词,请问用什么数据结构和算法来实现尽可能快地查找?这个很容易想到首先对文章进行分词,然后利用hash_map来保存所有的单词和单词出现的次数。进阶一 如果想要查找某一个字符串在所有单词的后缀中出现了多少次呢?比方说文章包含三个单词:”auto”, “goto”, “g原创 2015-03-23 21:41:15 · 2600 阅读 · 0 评论 -
[面试题] 不用算术运算符实现两个数的加法
思路:将两个数当作二进制数来处理,比方说6(110)+5(101)=11(1011),可以将二进制的加法过程分成两部分来处理:先不考虑进位求得两数的和(即两数按位异或),然后再将产生的和与进位结果(即两数按位与然后左移一位)相加,后面这一相加过程可以递归调用add函数来实现。代码如下:int add(const int a, const int b){ return b == 0 ? a原创 2017-08-23 16:53:20 · 651 阅读 · 0 评论 -
归并排序
如果归并排序中待归并的两个相邻序列分别Wi是r[start]~r[mid]和r[mid+1]~r[end],需要将其归并成一个新序列r1[start]~r1[end]:void merge(int r[], int r1[], int start, int mid, int end){ int i = start, j = mid + 1, k = start; while (i原创 2015-03-09 17:40:30 · 624 阅读 · 0 评论 -
冒泡排序
基本冒泡排序冒泡排序是最常见的交换排列。void BubbleSort0 (int data[], int n) // index[1, n]{ for (int i = 1; i < n; ++i) { for (int j = 1; j <= n - i; ++i) { if (data[j] > data[j + 1]) {原创 2015-03-08 15:33:45 · 694 阅读 · 0 评论 -
字符串模式匹配算法之一:朴素模式匹配算法
被搜索的字符串称为主串,待搜索的字符串称为模式串。朴素模式匹配算法的基本思想:对主串的每一个字符作为子串开头,与模式串进行匹配。对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成功或全部遍历完成为止。代码实现非常简单: int strStr(char *haystack, char *needle) { for (int i = 0;原创 2015-02-03 13:35:04 · 4128 阅读 · 1 评论 -
字符串模式匹配算法之二:KMP算法
KMP算法简介KMP算法全称叫做Knuth-Morris-Pratt Algorithm。被搜索的字符串称为主串,待搜索的字符串称为模式串。我们知道朴素模式匹配算法:http://blog.youkuaiyun.com/chfe007/article/details/43448655是很低效的,KMP算法从模式串出发,发现模式串中隐藏的信息来减少比较的次数,具体如何做到的可以移步这个链接:http原创 2015-02-03 15:07:12 · 881 阅读 · 0 评论 -
Moore's voting algorithm
最近在刷LeetCode的题的时候,发现一个特别巧妙的算法:Moore’s voting algorithm。这个算法是解决这样一个问题:从一个数组中找出出现半数以上的元素。Moore的主页上有这个算法的介绍:A Linear Time Majority Vote Algorithm和这个算法的一个简单示例演示:演示链接。算法的基本思想每次都找出一对不同的元素,原创 2015-01-20 15:57:00 · 11643 阅读 · 8 评论 -
面试题[动态规划]: 最长公共子序列
问题:输入两个字符串,返回最长公共子序列。最长公共子序列问题(Longest Common Subsequence)是经典的动态规划问题,可以通过以下方式来求解较小规模的问题:在找A和B的公共子序列时: 如果有am-1==bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列; 如果am-1!=bn-1,则要解决两个子问题: 找出“原创 2015-03-25 15:19:47 · 894 阅读 · 0 评论 -
桶排序
算法介绍桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。算法步骤如下:原创 2015-03-01 14:37:40 · 701 阅读 · 0 评论 -
堆排序
从大到小排序,小根堆。小根堆的筛选算法:void sift(int data[], int k, int m){ int i = k ,int j = 2 * k; while (j <= m) { if (j < m && data[j] > data[j + 1]) ++j; if (data[i] < data[j]) break;原创 2015-03-08 16:04:14 · 688 阅读 · 0 评论 -
TopN算法
TopN算法:从已经存在的数组中,找出最大(或最小)的前n个元素。算法(以找最大的n个元素为例): 1. 取出数组的前n个元素,创建长度为n的小根堆; 2. 从n开始循环数组的剩余元素,如果当前元素比小根堆的根节点大,则将当前元素设置成小根堆的根节点,并通过调整让堆保持小根堆; 3. 循环完成后,小根堆中的所有元素就是需要找的最大的n个元素; 4. 根据需要对小根堆中的所有元素继续利用堆排序原创 2015-03-08 18:13:48 · 11212 阅读 · 0 评论 -
统计整型数据二进制形式中1的个数
统计整型数据二进制形式中1的个数可以通过如下方式达到:int cnt1bits(int x) { int count = 0; while (x) { ++count; x = x & (x - 1); } return count;}原创 2015-03-06 15:52:37 · 760 阅读 · 0 评论 -
快速排序
本文选择第一个元素作为轴值,从小到达排序。快速排序算法的一趟排序如下:int Partion (int data[], int first, int end) { int i = first, j = end; int privot = data[i]; while (i < j) { while (i < j && data[j] > privot) --j原创 2015-03-08 16:29:56 · 703 阅读 · 0 评论 -
[面试题] 从抽屉找东西的概率学问题
面试题:假如你有4个没有任何区别的抽屉,你每次放东西有60%的概率会放在这四个抽屉里的某一个抽屉,40%的概率放在这四个抽屉以外的其他地方。现在假设你需要找一份文件,你找了前三个抽屉都没有找到,请问这个文件在最后那个抽屉的概率是多少?思路:这个文件最后只有两种可能,一是在最后那个抽屉,一是在抽屉以外的其他地方,所以在最后那个抽屉的概率是:(60% * 25%) / (60% * 25% + 40%)原创 2017-08-23 20:32:37 · 1616 阅读 · 0 评论