随笔分类 - Algorithm
一道百度笔试题
摘要:在看百度2013校园招聘笔试题,发现以下这道题有一定的思考价值。题目:有20个数组,每个数组有500个元素,并且是有序排列好的,现在在这20*500个数中找出排名前500的数。这道题一看就知道是个TopK的问题。解决这个问题思路如下:数组是有序的(假设是升序),我们要利用这个特性。首先构造一个大根堆(大小为数组个数即20),将每个数组当前最大的数放入堆中,然后取出大根堆的根,使用一个统计数组(大小为每个数组的长度即500)保存这个数,将这个数从大根堆中删除,接着再向大根堆中放入刚才删除的那个数的上一个数(数组是有序的),如此反复直到统计数组满了为止。#include #include#incl
阅读全文
海量数据处理
摘要:基本方法1、Hash法参考:常见hash算法的原理常见的Hash算法General Purpose Hash Function Algorithms2、Bit-map法利用Bit-map方法解决海量数据的查重和去重问题。/*已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码个数*/ #include #include #include using namespace std; #define minNumber 10000000#define maxNumber 99999999int N = (maxNumber-minNumber+1); //90000000#define
阅读全文
最小的k个数
摘要:题目:输入n个整数,找出其中的最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4思路:创建一个大小为k的大顶堆,每次从数组中读入一个数,与大顶堆的根作比较,如果小于根,将该数做根,然后调整大顶堆。依次比较,最后输出该大顶堆。package com.flyoung;public class K { public static void heapAjust(int[] array,int s,int m){ //调整大顶堆 int temp ,j; temp=array[s]; for(j=2*s;j<=...
阅读全文
排序算法总结
摘要:内排序主要类型:各排序算法比较:选择合适的排序方法应综合考虑以下因素:1、待排序的记录数目n2、记录的大小(规模)3、关键字的结构及其初始状态4、对稳定性的要求5、语言工具的条件6、存储结构7、时间和辅助空间的复杂度等不同条件下,排序算法的选择:1、若n较小(n<50)可采用直插法和简单选择法2、若文件初始状态基本有序(正序),则应选用直插法、冒泡或随机的快速排序为宜3、若n较大、则应采用时间复杂度为o(nlgn)的排序方法:堆排序、归并排序、快速排序 快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布的,快速排序的平均时间最短 堆排序需要的辅助空间少于快速
阅读全文
编程之美--3.5最短摘要生成
摘要:Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。 这道笔试题和编程之美最短摘要生成的方法类似,我用java实现了这个方法。 先来看看这些序列:w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1 问题在于,如何...
阅读全文
编程之美——3.1字符串移位包含问题
摘要:假设字符串s1=AABCD,s2=CDAA,判断s2是否可以通过S1的循环移位得到字符串包含。如 s1移两位: 1.ABCDA->2.BCDAA 则此时包含了 S2="CDAA"解题思路:分解s1的循环移位得到:AABCD,ABCDA,BCDAA,CDAAB,.....如果我们将前面移走的字符串保留下来,则有:AABCD,AABCDA,AABCDAA,AABCDAAB,AABCDAABC,AABCDAABCD这里,我们可以发现,实际对s1的循环移位得到的字符串实际为s1s1。那么我们判断s2是否可以通过s1循环移位得到包含,则只需要判断s1s1中是否含有s2即可以。用
阅读全文
《编程之美》3.10分层遍历二叉树
摘要:#include<iostream>#include<vector>using namespace std;const int Max=30;class Node{public: Node(int d):data(d),left(NULL),right(NULL){} int data; Node *left; Node *right;};template<class T>class queue{public: queue(int i=Max):front(0),rear(0){Q=new T[Max];} void EnQueue(Node *p){Q[r
阅读全文
《编程之美》3.9重建二叉树
摘要:#include<iostream>using namespace std;const int Max=20;struct Node{ Node *pLeft; Node *pRight; char chValue;};template <class T>class Stack{public: Stack(int s=Max):size(s),top(-1){a=new T[size];} ~Stack(){delete[] a;} void push(T x) { if(top<size-1) a[++top]=x; } T pop() { if(top>
阅读全文
《编程之美》3.9重建二叉树
摘要:#includeusing namespace std;const int Max=20;struct Node{ Node *pLeft; Node *pRight; char chValue;};template class Stack{public: Stack(int s=Max):size(s),top(-1){a=new T[size];} ~Stack(){delete[] a;} void push(T x) { if(top-1) return a[top--]; } T getT() const { if(top!=-1) return a[top]; } boo...
阅读全文
还是畅通工程
摘要:题目参见:http://acm.hdu.edu.cn/showproblem.php?pid=1233Prim实现#include<iostream>using namespace std;const int Maxv=101;int map[Maxv][Maxv];int vset[Maxv];//顶点访问记录int lowcost[Maxv];int main(){ int sum; int n,i,j,cost; while(scanf("%d",&n) && n) { int m=n*(n-1)/2; while(m--) { s
阅读全文
最小生成树
摘要:普里姆算法(Prim)普里姆算法基本思想:从图中某个顶点V0开始,将V0到其他顶点的所有边当做候选边,重复以下步骤n-1次,使得其他n-1个顶点并入到树中:1、从候选边中挑选出权值最小的边输出,并将该边另一端相接的顶点V并入树中;2、考察所有剩余顶点Vi,如果(V,Vi)的权值比lowcost[Vi]小则用(V,Vi)的权值更新lowcost[Vi]。普里姆算法模板#define MAXN 101 //定义顶点的最大可达数int n, sum; //顶点数,权值和int map[MAXN][MAXN]; //以邻接矩阵存储权值void prim(){ int vset[MAXN]; //记录顶
阅读全文
浙公网安备 33010602011771号