文章分类 -  Algorithms

数据结构基础算法
摘要:http://www.cnblogs.com/pangxiaodong/archive/2011/09/24/2189593.html问题描述:我这里有很多学生的学号(有重复的),已知其中有K个学生,他们的学号出现的次数都超过了总数的1/(K+1),请把这K个学号找出来。上代码:#include<iostream>#include<list>#include<utility>using namespace std;template<typename T,size_t N>inline size_t getArrLen(T (&arr)[N 阅读全文
posted @ 2011-11-17 22:48 张朝阳讲go语言 阅读(655) 评论(0) 推荐(0)
摘要:问题描述和解题思路见此:http://www.cnblogs.com/flyinghearts/archive/2011/03/24/1994453.html。关于此问题我没什么好说的,值得一提的是请注意下面我的代码里那两个辅助函数:C++返回数组的长度;同时查找数组中的最大者和最小者。#include<iostream>#include<map>#include<vector>#include<algorithm>#include<string>#include<utility> //pairusing namespac 阅读全文
posted @ 2011-11-16 18:49 张朝阳讲go语言 阅读(1144) 评论(0) 推荐(0)
摘要:原始文件存储了每个特征项及其对应的IG值,一行一条记录,约11.7万行。#ifndef TERM_H#define TERM_H#include<string>using std::string;class term{private: string word; double ig;public: term(string word,double ig):word(word),ig(ig){ } string getWord() const{ return word; } void setIG(double newig){ ig=newig... 阅读全文
posted @ 2011-11-06 22:06 张朝阳讲go语言 阅读(7366) 评论(1) 推荐(0)
摘要:选择问题即:寻找N个元素中的第K个最大者。选择问题的特殊情况是找最大者或最小者,这当然很简单了。还是一个特例找中位数。《寻找N个元素中的前K个最大者》方法总结是在这里看到的http://zhangliang008008.blog.163.com/blog/static/25136049200882423842325/,我觉得解法二和解法四用得广泛一些,编程实现了一下。利用快速排序中的partition操作经过partition后,pivot左边的序列sa都大于pivot右边的序列sb;如果|sa|==K或者|sa|==K-1,则数组的前K个元素就是最大的前K个元素,算法终止;如果|sa|< 阅读全文
posted @ 2011-11-05 09:48 张朝阳讲go语言 阅读(3591) 评论(0) 推荐(0)
摘要:首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把序列分成了两部分,前半部分无序,后半部分升序排列,并且后半部分的数都大于前半部的数。由此可得到快速排序和冒泡排序的一些共同点:都要经历n趟排序每趟排序要经历O(n)次比较都是后半部分元素比前半部大而不同之处就在于冒泡排序的交换操作发生相邻的元素之间,即一趟排序可以要经过多次交换操作;快速排序的交换操作发生在间隔比较远的两个元素之间,一趟排序要经过交换操作次数会少一些。下面给出快速排序的递归和非递归实现代码:#include<iostream>#include<vector>#include< 阅读全文
posted @ 2011-11-03 17:33 张朝阳讲go语言 阅读(40269) 评论(6) 推荐(2)
摘要:set存储已排序的无重复的元素,multiset是元素可以重复.为实现快速的集合运算set内部数据组织采用红黑树(一种严格意义上的平衡二叉树).map存储key-value对,按key排序,map的内部数据结构也是红黑树,并且key值无重复.multimap允许key值重复.STL中算法包含在<Algorithm>头文件中,集合的算法也包含在该头文件中.集合的并:set_union集合的交:set_intersection集合的差:set_differnce给一个set的例子:#include<algorithm>#include<iostream>#inc 阅读全文
posted @ 2011-04-25 09:18 张朝阳讲go语言 阅读(13538) 评论(0) 推荐(1)
摘要:<<编程珠玑>>开篇就讲了一个用位图散列解决用少量内存解决大量数据排序的问题.现在有10 000 000条互不相同的数据,2M的内在,无限大的硬盘空间.用散列表来实现这些数据的存储和查找.假如要存储一组小于20的非负整数的集合,可以用一个20bit的串来表示.比如集合{1,5,8,13}可以表示为:0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0第i位上有数据则置为1,否则置为0因此存储10 000 000条数据需要10 000 000bit=1 250 000Byte=1.25M<2M构建散列表的同时就完成了对数据和排序,如果要查找 阅读全文
posted @ 2011-04-24 09:49 张朝阳讲go语言 阅读(1280) 评论(2) 推荐(0)
摘要:就拿这个图做实验了#include<iostream>#include<vector>#include<queue>using namespace std;struct ArcNode{ //弧结点结构 int adjvex; //邻接顶点 ArcNode *nextarc; //下一条弧};template <class T>struct VertextNode{ //表头结点结构 T Vertext; //顶点 ArcNode* firstArc; //第一条弧};const int MAXSIZE=10;template<class 阅读全文
posted @ 2011-04-23 18:16 张朝阳讲go语言 阅读(4396) 评论(0) 推荐(0)
摘要:串的模式匹配就是从一个主串中找到子串出现的位置,如主串是"asd234",子串是"d2",那么算法返回的结果就应该是2.一种最朴素的想法就是BF算法,我就不讲了,"最朴素"嘛,就是你脑子里现在想的那种算法.比较优一点的是KMP算法.更优的是BM算法.BM的改进算法是Sunday Algorithm.现在我给出BF和Sunday两种算法的代码,然后再和STL中string在find函数进行比较.STL中string在find函数示例:string name("AnnaBelle");string::size_type 阅读全文
posted @ 2011-04-22 20:26 张朝阳讲go语言 阅读(575) 评论(0) 推荐(0)
摘要:代码依据书上的例子写出来的,<<数据结构与算法分析C++描述>>Mark Allen Weiss著,张怀勇译Prim算法:#include<iostream>#include<vector>using namespace std;const int INF=0xfffffff;struct mark{ bool known; int dv; int pv; mark(){ dv=INF; pv=INF; known=false; } };int main(){ int graph[7][7]={{0,2,4,1,0,0,0}, {2,0,0,3, 阅读全文
posted @ 2011-04-15 15:16 张朝阳讲go语言 阅读(799) 评论(0) 推荐(0)
摘要:最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一 阅读全文
posted @ 2011-04-11 09:30 张朝阳讲go语言 阅读(55503) 评论(14) 推荐(20)
摘要:各大公司招聘每次笔试都碰到这种题,今天来把它说清楚.三序中知道其中两个就可以推出第三个,但前提是我们必须知道中序.因为:先序和后序给我们提供的信息是一样的--告诉我们谁是根节点中序则告诉我们左右子树在哪儿例:已知先序为eacbdgf,中序为abcdefg,求后序由先序我们知道e为根节点,我们在中序中把左右子树括起来--(abcd)e(fg)同样对左子树abcd进行分析,先序为acbd,中序为abcd.--a(bcd)递归下去就可以了后序为bdcafge代码实现上述例子:#include "stdio.h"#include "string.h"#inclu 阅读全文
posted @ 2011-04-07 18:42 张朝阳讲go语言 阅读(8035) 评论(3) 推荐(2)
摘要:首先声明我们的表达式(expression)只是简单的四则运算,再加上小括号.操作数operand,操作符operator如果直接给出后缀表达式(postfix,也叫逆波兰式)是最容易计算的,这种表达式中已经不含括号.方法:遇到操作数时压入栈中;遇到操作符时从栈中弹出两个元素进行此运算,再将运算结果压入栈中.代码如下:#include<iostream>#include<cstdlib>#include<stack>#include<vector>#include<string>using namespace std;int main 阅读全文
posted @ 2011-04-07 17:00 张朝阳讲go语言 阅读(851) 评论(0) 推荐(1)
摘要:当我们画一个80*50的迷宫时相当于是画了个80*50的方格子,把格子和格子之间的某些墙拆掉,互相连通的格子我们称之为属于同一个集合,如果两个集合不连通,那就称之为不相交集.画迷宫的过程就是不断地拆除格子与格子之间的墙,直到第一个格子和最后一个格子属于同一个集合算法终止.不相交集类.#ifndef _DISJSETS_H#define _DISJSETS_H#include <vector>using namespace std;class DisjSets{public: explicit DisjSets(int numElems); int find(int x); void 阅读全文
posted @ 2011-03-30 09:37 张朝阳讲go语言 阅读(1262) 评论(2) 推荐(0)
摘要:看到这个题目,俗了,大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。书上计算PI用的是精确的数值计算方法,我这里再给出一种概率计算方法。OpenMP和MPI将同时亮相。计算PI的方法1.tan(PI/4)=1 => PI=4arctan1。知道arctan1转化为定积分的形式是什么吧。利用arctan(x)的幂级数展开式,可以手工地计算PI另外也可以采用正式手工计算PI#include<stdio.h>#include<time.h>#define N 1000000main(){ double local,pi=0.0,w; long i; w=1 阅读全文
posted @ 2010-11-07 19:29 张朝阳讲go语言 阅读(10220) 评论(0) 推荐(0)
摘要:Dijkstra单源节点到其他所有节点的最短路径#include<iostream>#include<vector>#include<queue>#include<stack>using namespace std;const int INFINIT=32767;struct tableItem{ int prevIndex; int dist; bool found; tableItem(int p=-1,int d=INFINIT,bool f=false): prevIndex(p),dist(d),found(f){}};int main 阅读全文
posted @ 2010-11-03 22:04 张朝阳讲go语言 阅读(535) 评论(0) 推荐(0)
摘要:网络流要满足的条件:(1)除源source与汇sink外,其他节点上的注入必须等于流出;(2)各边上的实际流量不能大于容量。从源发出的实际流量总和(或者说汇收到的实际流量总和)等于网络的流量。 阅读全文
posted @ 2010-11-03 17:02 张朝阳讲go语言 阅读(246) 评论(0) 推荐(0)
摘要:斐波那契数的计算公式是F(n)=F(n-1)+F(n-2),F(0)=F(1)=1任何递推的数学公式都可以直接翻译为递归的算法,于是递归的斐波那契数计算方法是这样的:int fib(int n){ if(n<=1) return 1; else return fib(n-1)+fib(n-2);}但是这样导致了大量的重复计算,造成时间和空间的极大浪费,如下图所示把递归的算法写成非递归的算法,子问题的答案记录在一个表里,这种技巧就是动态规划。在计算斐波那契数的时候我们只需要把F(n)和F(n+1)保留到计算出F(n+2)就可以了,不需要一直保存。改进后的算法如下:int fibonacci 阅读全文
posted @ 2010-10-22 11:33 张朝阳讲go语言 阅读(1285) 评论(3) 推荐(0)
摘要:Realize topological sort with adjacent matrix: 阅读全文
posted @ 2010-10-04 11:49 张朝阳讲go语言 阅读(301) 评论(0) 推荐(0)
摘要:关于算术编码的介绍请见CSDN上Gjack的博客。http://blog.csdn.net/Gjack/archive/2010/01/15/5193754.aspx#include<iostream>#include<map>#include<string>#include<cassert>#include<utility>using ... 阅读全文
posted @ 2010-09-28 16:58 张朝阳讲go语言 阅读(897) 评论(0) 推荐(0)