博文

败者树的实现(c++)(2008-04-05 19:38:00)

摘要:#include <iostream.h>#include <stdlib.h>#include <stdio.h>#include <time.h>#include <string.h> #define MAX_BUFFER 512 //buffer最大容量#define NO_MEANING 99999999 //当某顺串已经全部处理完时,给败方树外部节点填充这个超大值#define MAX 10 //最大选手数目 /********************* 缓冲区类,用环状数组实现的队列来实现之 ********************///设置头指针front,尾指针rear//插入在rear处,删除在front处template <class Elem> class Buffer{  private:  Elem * buf; //存放元素的数组  int front, rear;  int n; //buffer中当前元素的数目  public:    //constructor  Buffer(){   buf = new Elem [MAX_BUFFER];   front = 0;   rear = 0;   n = 0;     }   //destructor  ~Buffer(){  delete buf;  }   //判断buffer是否为空  bool isEmpty(){   return (n==0);  }   //判断buffer是否满  bool isFull(){ ......

阅读全文(6222) | 评论:0

排序算法的实现(2008-03-29 19:14:00)

摘要://                排序算法的实现#include <iostream>using namespace std; //插入排序void swap(int Array[],int i,int j){ int temp=Array[i]; Array[i]=Array[j]; Array[j]=temp;}void InsertSort(int Array[],int n){ for(int i=1;i<n;i++) {  for(int j=i;j>0;j--)  {   if(Array[j]<Array[j-1])    swap(Array,j,j-1);   else break;  } }}//优化插入排序void ImprovedInertSorter(int Array[],int n){ int  Temp; for(int i=1;i<n;i++) {  Temp=Array[i];  int j=i-1;  while((j>=0)&&(Temp<Array[j]))  {   Array[j+1]=Array[j];   j=j-1;  }  Array[j+1]=Temp; }}//二分法插入排序void BinaryInsertSorter(int Array[],int n){ int temp; int left,right,middle; for(int i=1;i<n;i++) {  temp=Arr......

阅读全文(2254) | 评论:0

“大整数阶乖”问题的递推算法(2007-10-26 18:07:00)

摘要: “大整数阶乖”问题的递推算法 /* 标题:<<系统设计师>>应试编程实例-[递推算法程序设计] 作者:成晓旭 时间:2002年09月11日(11:52:00-16:26:00)    实现递推算法的大整数阶乖处理函数 时间:2002年09月16日(18:38:00-20:02:00)    实现“斐波那契数列”问题的递推算法函数*/ //:============================“大整数阶乖”问题的递推算法===========================#define  MAXN 1000  //最大数据位数//用递推法求取整数k的阶乖,将结果放入数组array中void pnext(int array[],int k){ int *temp; //动态数组[临时存储运算大整数] int i,j,num_len = array[0],carry,t; //循环变量,长整数位数,进位标志,临时变量 if(array[0] >= MAXN) {  printf("数据处理位数超过程序设计上限,程序将自动中断运行!\n");  exit(1); } temp = (int *)malloc(sizeof(int) * (num_len + 1)); //创建动态数组 for(i=1;i<=num_len;i++)  temp[i] = array[i];  //保存原始数据 for(j=1;j<k;j++) {  for(carry = 0,i=1;i<=num_len;i++)  {   if(i <= array[0])       t = array[i]......

阅读全文(2481) | 评论:0

从union的sizeof问题看cpu的对界(2007-10-26 14:50:00)

摘要:考虑下面问题:(默认对齐方式) union u{ double a; int b;}; union u2{ char a[13]; int b;}; union u3{ char a[13]; char b;}; cout<<sizeof(u)<<endl; // 8cout<<sizeof(u2)<<endl; // 16cout<<sizeof(u3)<<endl; // 13   都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。   结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。   顺便提一下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。对界是可以更改的,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。C++固有类型的对界取编译器对界方式与自身大小中较小的一个。例如,指定编译器按2对界,int类型的大小是4,则int的对界为2和4中较小的2。在默认的对界方式下,因为几乎所有的数据类型都不大于默认的对界方式8(除了long double),所以所有的固有类型的对界方式可以认为就是类型自身的大小。更改一下上面的程序: #pragma pack(2)union u2{ char a[13]; int b;}; union u3{ char a[13]; char b;};#pragma pack(8) cout<<sizeof(u2)<<endl; // 14cout<<sizeof(u3)<<endl; // 13   由于手动更改对界方式为2,所以i......

阅读全文(2887) | 评论:0

google代码搜索的标准KMP算法实现(2007-10-24 11:59:00)

摘要:             这是我在google 上的代码搜索出来的KMP算法我觉得写的还可以啊,自己拿来学学。 KMP.h#ifndef _KMP_H_ #define _KMP_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern int KMP(const char* strPattern, int len, const char* strTarget); extern void KMP_end(); #ifdef __cplusplus } #endif /* __cplusplus */ #endif 申明一下。这个KMP是在字典程序中的一段。所以这个他用来申明的外部函数。KMP.cpp#include <stdio.h> #include <stdlib.h> #include <string.h> #include "kmp.h" static int* prefix = NULL; static int max_size = 0; static void GetPrefixValue(const char* strPattern, int iPatternLen) { if (iPatternLen>max_size) { prefix = (int*)realloc(prefix, iPatternLen*sizeof(int)); max_size = iPatternLen; } int i, j; /* i runs through the string, j counts the hits*/ i = 1; j = 0; prefix[0] = 0; while(i<iPatternLen) { if(s......

阅读全文(4016) | 评论:0

牛人从达内中国移动到百度、IBM的一点感受(2007-10-15 14:49:00)

摘要:胡金培  男  25岁 对外经贸大学  电子商务  大专 SD0410班   培训前情况: 无工作经验   培训后情况: 现工作于IBM,月薪8000元   就业公司介绍: IBM,全球最大的信息技术公司,世界一流的软件公司     从达内>中国移动(梦网运营中心)>百度>IBM的一点感受......   恩,已经接近深夜了。最近一直在加班没有时间来写些东西。不过还好10.1的快到了。项目也快接近尾声。我现在在这里主要做的工作是ORACLE DBA。2年前我参加了达内的外企软件工程班主修JAVA/C++。那个时候我23岁,实话讲在参加培训前,我接触过一些ORACLE+UNIX的东西,但是没有工作经验。和大家一样也是预习了3个月才来培训。那个时候的达内好象还没有现在那么壮大。不过还是为达内的快速发展感到由衷的高兴。和大家说说我的经历吧。其实以前我也写过一写经验相关的东西。但是这次主要是针对工作,同时也是对我工作一年以来的经历做个小小的简短的总结吧:)呵呵。 在达内学习的是5个月,应该是我这一生中记忆最为深刻逸事之一。坐在第二排的过道右手边第一个位置上的感觉,到现在还在脑中浮现,那种感觉挥之不去,每当路过中鼎,内心顿时萌生了一种抑扬的忧伤的回忆。真的那个时候的感觉可以说真的是痛并快乐的!真的非常苦,也非常累。实话讲在培训期间,我没有过2点睡过觉的....当然我所在的寝室的学习气氛也很不错,其实针对培训的学习方法,我认为千言万语一句话:多看书,多动手。我想论坛的很多朋友已经讲很多了,我就不细说了,不过我还是要在这里特别谢谢张健,刘新福老师的指导!我想这两位好老师给达内打出了不少牌子。 毕业后,由于是学软件开发,没有做项目就去冲动地找工作了,记得面试的第一份工作是坐落在西直门(还离我家真远)的KONGZHONG(空中网)。笔试都过了,但是谈的时候那个技术人员显然看出我没有工作经验,本来谈好的第二次预约也就再也没有联系我。呵呵。不过接踵而来的有了很多的面试机会。很巧就获得了移动-卓望的面试机会。我以优越的表现赢得了很多考官的赞扬。同时比空中网好的地方在于,他们能根据你面试的过程来给你一个准确的评价,这对于我来说非常有意义。当......

阅读全文(4143) | 评论:0

大学计算机软件专业生应该学什么[摘](2007-10-14 23:54:00)

摘要:           收到一封mail,是一个计算机系大三学生写来的,想听听我的建议,面临将要毕业的关口,应该学点什么才能对将来有用。随后又有不少朋友通过mail,im等等方式询问我对这个问题的看法。   我本来不是计算机专业出身,也并非大师之类的人物,本来不敢好为人师。不过,既然作了这个行业,也算有点心得,被问到,也就说点心得和建议,对与不对,各位看官指教。盖个体情况差距极大,本文是个人观点,也就姑且一听,有用则用,当然,这世上怕也没有所谓万全之策的。   1、你是否真的喜欢计算机   我是真的喜欢的。如果让我选择发了大财做什么,我仍然继续玩计算机,只不过可以更自由自在的玩喜欢的东西。如果你也喜欢,喜欢学新的东西,喜欢复杂而精巧的设计,喜欢工程之美,那就适合走技术道路。如果不是这样,这条路比较辛苦,还请三思。其实产业里相关的领域也大有可为,比如说写技术相关的趋势作者,鲜有优秀的。目前除了互联网周刊的陈琼同学,我还没看到给商业媒体写技术相关的写手有几个写的好的,甚至往往都有致命的本质错误。诸如此类的周边领域很多,都有不错的机会,不一一列举。   2、假如1你回答的是喜欢,那么   你需要学习很多东西。我认为不可缺少的东西包括:   * 基础理论  * 算法  * C语言  * C++或java,如果精通C,可以舍弃C++,学java  * unix  * 正则表达式  * 任何一种脚本语言(目前推荐python)   依次讲解为什么这么说   * 基础理论和算法   20年来,应用层面急速发展,令人眼花撩乱,而实际上,大幕之后的东西,从1972年C和unix诞生以来就没有过本质的变化。在操作系统,数据库理论,编译原理,信息管理系统理论之类,都是*相对*静止的。虽然其中有类似于微内核还是整体内核之类的理论之争,但是几乎不影响格局,大可以放心去学。学这些东西唯一的问题是理论枯燥,最好是结合实践,做一些应用,学一些理论,张弛有度,这样总能保证好奇心旺盛。   学这些东西的目的是为了真正的了解计算机。不真正了解一个东西,很难举一反三,很难作到融汇贯通。其实高校教的这些东西都极有价值,只不过是在缺乏实践的基础上填鸭,效果往往变成了应付考试。 * C语言 ......

阅读全文(2765) | 评论:2

Linux c&c++编译器(2007-10-14 00:53:00)

摘要:介绍]       gcc   and   g++分别是gnu的c   &   c++编译器           gcc/g++在执行编译工作的时候,总共需要4步           1.预处理,生成.i的文件       2.将预处理后的文件不转换成汇编语言,生成文件.s       3.有汇编变为目标代码(机器代码)生成.o的文件       4.连接目标代码,生成可执行程序               [参数详解]       -x   language   filename              设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根            据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果            你很个性,决定你的C代码文件的后缀名是.pig   哈哈,那你就要用这            个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数            的使用。            可以使用的参数吗有下面的这些              `c',   `objective-c',   `c-header',   `c++',   `cpp-output',                `assembler',   and   `assembler-with-cpp'. &......

阅读全文(3950) | 评论:0

如何使用gcc编译器?(2007-10-13 23:53:00)

摘要:摘要: 要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。   GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到 这里 阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下: 预编译 (gcc -E), 编译 (gcc), 汇编 (as),和 连接 (ld)。   开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include <stdio.h> int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。 你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它: a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。我们可以通过使用 -o 编译选项,告诉 gcc我们想把可执行文件叫什么名字。我们将把这个程序叫做 game,我们可以使用任何名字,因为C没有Java那样的命名限制。 gcc -o game game.c game Hello W......

阅读全文(2681) | 评论:0

评审透露微软笔试经验(2007-10-12 21:41:00)

摘要:                    每年的秋季学期,正是校园招聘的高峰期。作为招聘流程的第一个重要环节,在今年的九月至十一月里,微软公司将统一安排三场全国性的笔试进行初选。对微软笔试感兴趣的考生,或许都想知道自己的答卷是怎么被“评判”的? 本文是去年笔试出题和阅卷小组对当年部分考生提问的一些解答,仅与今年参加笔试的同学们做参考。需要说明的是,虽然今年笔试的基本思路与去年大体一致,但请同学们仍以今年的考卷题型为准。  2006年微软笔试评审组   撰文:邹欣   1.  2006年秋季学期的笔试是由微软多个部门的工程师和经理集体出题,所有申请技术职位的应届毕业同学都建议考试。由于全国有很多所高校,因此我们还分了全国统一考卷(written test)和在各个城市进行的小型考试(mini-test)。   2.  为了让各次考试有一个可比的分数,HR要求我们出题的难度尽量一致。2006年9月27日第一个mini-test后,通过分析同学们的反馈(3%很难、40%难、54%一般、3%容易),我们认为题目的难度基本符合要求(略微“一般”了一点)。于是在以后的考题中稍稍提高了难度,并对各类题型略为修改。从分数看,不少同学大大低估了试题的难度,或者说低估了我们对答案的期望。一言蔽之——我们希望看到接近“职业”水平的答案:)。   3.  倒扣分:公司的大部分同事们认为这是比较有效的甄别方法。我们尽量避免非常偏僻的知识点和有争议的答案。   4.  判分:我们所有的卷子都全部判分,每个部门都抽调了不少工程师加班判卷。我个人所看到的情况是,同学们写的每一行都会被看到,对于一些很难读通的程序,我们会一起分析,不会因为一眼看不懂就给个0分。对于单项题答得非常好的同学,我们会特别标记。像这样的无绝对标准答案的试卷,判卷是~相~当累人的活。至于会不会把所有分数都全部告知考生,这由各个你所申请的部门决定。   5.  英语:由于所有题目都是英语,一些同......

阅读全文(2246) | 评论:0