Loading

上一页 1 ··· 5 6 7 8 9
摘要: 寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数。可以使用二分搜索的策略来寻找N个数中的第K大的数。对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数。寻找第k大的元素:#include <iostream>using namespace std;//快速排序的划分函数int partition(int a[],int l,int r){ int i,j,x,temp; i = l; j = r+1; x = a[l]; //将>=x的元素换到左边区域 //将<=x的元素换到右边区域 while (1... 阅读全文
posted @ 2012-08-06 10:59 阿凡卢 阅读(14452) 评论(4) 推荐(0) 编辑
摘要: 会场安排问题问题描述:假设要在足够多的会场里安排一批活动,活动的开始时间和结束时间已知,并希望使用尽可能少的会场。设计一个有效的算法进行安排。分析:这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,就对应要找的最小会场数。 图的最少着色问题,至今没有有效的算法,但这个问题和图的着色问题有不同,活动的时间区间之间的约束关系转化得到的图,属于区间图。我们可以用贪心策略来解决。分析解答:(1)n个活动开始和结束时间分别是s[i]和f[i],s[i]<f[i]。(2)把n个活动时间看做直线上n个区间,把所有的s[i]和f[ 阅读全文
posted @ 2012-08-06 10:08 阿凡卢 阅读(5165) 评论(1) 推荐(0) 编辑
摘要: 一.八数码问题八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。八数码问题一般使用搜索法来解。搜索法有广度优先搜索法、深度优先搜索法、A*算法等。这里通过用不同方法解八数码问题来比较一下不同搜索法的效果。二.搜索算 阅读全文
posted @ 2012-08-05 19:27 阿凡卢 阅读(31568) 评论(2) 推荐(3) 编辑
摘要: 问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g“的方式来达到目的。上面的两种方案,都仅需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,给定任意两个字符串,你是否能写出一个算法来计算出它们的距离?分析与解法不难 阅读全文
posted @ 2012-08-05 15:07 阿凡卢 阅读(3428) 评论(0) 推荐(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开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-n*(n-1)/2)%n==0,这样就很容易判断 阅读全文
posted @ 2012-08-05 14:44 阿凡卢 阅读(9835) 评论(0) 推荐(0) 编辑
摘要: 问题:给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为19。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。int max_sub_sum1(int a[],int size){ int maxSum = 0; for(int i = 0; i < size; i++ ) for(int j ... 阅读全文
posted @ 2012-08-05 13:56 阿凡卢 阅读(561) 评论(0) 推荐(0) 编辑
摘要: 创建一个使用wpcap.dll的应用程序 用 Microsoft Visual C++ 创建一个使用 wpcap.dll 的应用程序,需要按一下步骤: 在每一个使用了库的源程序中,将 pcap.h头文件包含(include)进来。 如果你在程序中使用了WinPcap中提供给Win32平台的特有的函数 阅读全文
posted @ 2012-08-05 09:50 阿凡卢 阅读(22726) 评论(1) 推荐(1) 编辑
摘要: Dijkstra算法算法流程:(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞;(b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径;(c) 修改最短路径:计算u的邻接点的最短路径,若(v,…,u)+(u,w)<(v,…,w),则以(v,…,u,w)代替。(d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。特点:总是按照从小到大的顺序求得最短路径。假设一共有N个节点,出发结点为s,需要一个一维数组prev[N]来记录前一个节点序号,一个一维数组dist[N]来记录从原点到当前节点最短路径(初始值为s到Vi的边的权值,没有则 阅读全文
posted @ 2012-08-04 16:14 阿凡卢 阅读(7690) 评论(0) 推荐(1) 编辑
摘要: 1.DFS(深度优先搜索)深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节... 阅读全文
posted @ 2012-08-04 16:02 阿凡卢 阅读(28226) 评论(0) 推荐(7) 编辑
摘要: 1、后序表达式求值:后续表达式(逆波兰式)的特点:没有括号。求值方法:从前向后扫,遇到操作数压栈;遇到操作符,从栈中取出2个操作数运算,结果压栈。最终栈中所剩的数为结果。2、中序表达式求值我们先来定义运算符的优先级:(+,-*,/,%从上到下依次升高准备2个栈,一个专门存放运算符,另一个专门存放操作数。1.遇到),那么退栈计算到(为止.结果压栈。2.遇到运算数.那么压栈。3.如果当前运算符优先级低于栈顶运算符.那么计算栈顶运算符并将结果压栈.4.否则压栈.计算带括号和浮点数的表达式:View Code #include<iostream> #include<stack> 阅读全文
posted @ 2012-08-04 12:34 阿凡卢 阅读(7929) 评论(0) 推荐(1) 编辑
摘要: 1.判断二叉树是否平衡//求树的高度int TreeDepth(Node* t){ int hl,hr,h; if(t != NULL) { hl = TreeDepth(t->left); hr = TreeDepth(t->right); h = hl>hr? hl:hr; return h+1; } return 0;}//判断二叉树是否平衡int isBalanced(Node* t) { if(t==NULL) return 1; int leftDepth = TreeDepth... 阅读全文
posted @ 2012-08-04 12:10 阿凡卢 阅读(6752) 评论(0) 推荐(1) 编辑
摘要: 二叉树的基本操作,都使用递归://二叉树 class Node { public: char data; Node *left; Node *right; Node():data(' '),left(NULL),right(NULL){} Node(char ch):data(ch),left(NULL),right(NULL){} }; //广义表建立二叉树,输入:A(B(D,E(G,)),C(,F))* void CreateBinTree(Node* & Root,char *str) { stack<... 阅读全文
posted @ 2012-08-04 11:52 阿凡卢 阅读(1907) 评论(0) 推荐(0) 编辑
摘要: 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是google的一道面试题。看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下 阅读全文
posted @ 2012-08-04 10:47 阿凡卢 阅读(1052) 评论(0) 推荐(0) 编辑
摘要: //优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using namespace std; class Node { public: float weight; Node* left; Node* right; char ch; Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c... 阅读全文
posted @ 2012-08-04 10:10 阿凡卢 阅读(1340) 评论(0) 推荐(0) 编辑
摘要: 单向循环链表:空表:L->next = L。与单链表的联系:判断表尾的方法不同:单链表用p==NULL;循环链表用p==L。双向循环链表:一个结点包含指向后继(next) 和指向前驱(prior) 两个指针,两个方向又分别构成循环链表。双向循环链表的插入和删除:1.p之后插入ss->next = p->next;p->next = s;s->prior = p;s->next->prior = s;2.p之前插入ss->prior= p->prior;p->prior = s;s->next = p;s->prior-&g 阅读全文
posted @ 2012-08-03 22:28 阿凡卢 阅读(540) 评论(0) 推荐(0) 编辑
摘要: 链表:1、注意是否有带头结点。2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。3、单链表的插入、删除操作需要寻找前驱结点。单链表的建立、排序和翻转,都是针对有头结点的单链表。#include <iostream>using namespace std;typedef struct Node{ int data; Node * next;}Node,*List;//顺序建表:尾插法void CreateLinkList(List& L, int n){ // 建立空表 L = (List)malloc(sizeof(Node)); L->next = N... 阅读全文
posted @ 2012-08-03 22:00 阿凡卢 阅读(1381) 评论(0) 推荐(0) 编辑
摘要: 先看代码: 1 #include <iostream> 2 using namespace std; 3 4 class A {}; 5 6 class B 7 { 8 public: 9 B(){}10 B(A& a){}11 };12 13 class B1: public B14 {15 public:16 B1(const B& b) : B(b)17 {}18 };19 20 int main()21 {22 A a;23 B b(a);24 B1 b1(a);25 return 0;26 ... 阅读全文
posted @ 2012-08-03 20:01 阿凡卢 阅读(3323) 评论(1) 推荐(1) 编辑
摘要: 一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。#include <iostream>using namespace std;//只能在堆 阅读全文
posted @ 2012-08-03 16:10 阿凡卢 阅读(4315) 评论(1) 推荐(1) 编辑
摘要: 1、字符串数字之间的转换(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->string char *p = "OK"; string str(p);(3)char * -->CString char *p ="OK"; CString m_Str(p); //或者 CString m_Str; m_Str.Format("%s",p);(4)CString --> char * CString 阅读全文
posted @ 2012-08-03 16:00 阿凡卢 阅读(210224) 评论(5) 推荐(16) 编辑
摘要: 开博第一篇,hello world!#include <iostream>using namespace std;class say{public: say() { cout << "Hello "; } ~say() { cout << "world!"; }}hello;int main(){ return 0;}使用过下面两个博客,开学找工作,把以前学的一些东西,重新整理一下发布在这里。http://hi.baidu.com/new/xun1573http://blog.csdn.net/luxiaoxun 阅读全文
posted @ 2012-08-03 15:25 阿凡卢 阅读(658) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9