??xml version="1.0" encoding="utf-8" standalone="yes"?> 要求旉复杂度空间复杂度都尽可能的低?/p>
旉复杂?OQnQ? I间复杂度OQ?Q,帔R旉?/p>
http://blog.csdn.net/zdl1016/archive/2009/09/21/4575309.aspx
// ~程珠玑 W二?nbsp;字符串string循环UMi?br>
// eg "abcdefgh" 循环UM 3?nbsp;=?nbsp;"defghabc"
#include<iostream.h>
#include <string.h>
char* string_cyclicshift_v2( char* string, int i )
{
char ch;
int exchange;
int len;
exchange = 0;
len = strlen( string );
i = i%len;
if ( 0 == i )
return string;
int start_pos=0;
while ( exchange<len )
{
char ch = string[start_pos];
int currpos = start_pos;
int nextpos = (len+currpos+i)%len;
while ( nextpos != start_pos )
{
string[currpos] = string[nextpos];
++exchange;
currpos = nextpos;
nextpos = (len+currpos+i)%len;
}
cout<<string<<endl;
string[currpos] = ch;
++exchange;
++start_pos;
}
return string;
}
int main(){ char string[7]={'a','b','h','d','h','s'};
cout<<string<<endl;
char* s;
s=string_cyclicshift_v2(string,4);
cout<<s<<endl;
return 0;
}
#include<iostream.h>
#define N 13
void sift(int* a,int low,int high){ int i=low;
int j=2*i;
int temp=a[i];
while(j<=high){
if (j<high && a[j]<a[j+1])
{
j++;
}
if (temp<a[j])
{
a[i]=a[j];
i=j;
j=2*i;
}else
break;
}
a[i]=temp;
}
void heap_sort(int* a,int n){ int i;
int temp;
for (i=n/2;i>=0;i--)
{
sift(a,i,n-1);
}
for (i=n-1;i>0;i--)
{
temp=a[0];
a[0]=a[i];
a[i]=temp;
sift(a,0,i-1);
}
}
void sort_print(int* a,int n){ for (int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){ int a[N]={34,34,566,66,77,8,989,6676,12323,89,90,123,4355};
sort_print(a,N);
heap_sort(a,N);
sort_print(a,N);
}
]]>
法的力量(转李开复)(j)---适合计算Z业新?/p>
法的力?
2006q??
法是计机U学领域最重要的基石之一Q但却受C(jin)国内一些程序员的冷落许多学生看C些公司在招聘时要求的~程语言五花八门Q就产生?jin)一U误解,认ؓ(f)学计机是学各U编E语aQ或者认为,学习(fn)最新的语言技术标准就是最好的\Ҏ(gu)其实Q大家被q些公司误导?jin)编E语a虽然该学Q但是学?fn)计机法和理论更重要Q因机语言和开发^台日新月异,但万变(sh)d宗的是那些算法和理论Q例如数据结构算法编译原理计机体系l构关系型数据库原理{等在开复学生网上,有位同学生动地把q些基础评比拟为内功,把新的语a技术标准比拟ؓ(f)外功整天赶时髦的人最后只懂得招式Q没有功力,是不可能成ؓ(f)高手?
法与我
当我?980q{入计机U学pLQ还没有多少人的专业方向是计机U学有许多其他系的h嘲笑我们_(d)(x)知道Z么只有你们系要加一个科学,而没有物理科学系或化学科学系吗?因ؓ(f)人家是真的科?不需要画蛇添I而你们自己心(j)虚,生怕不U学Q才q样Ʋ盖弥嘪 其实Q这点他们彻底弄错了(jin)真正学懂计算机的人(不只是编E匠Q都Ҏ(gu)学有相当的造诣Q既能用U学家的严}思维来求证,也能用工E师的务实手D|解决问题而这U思维和手D늚最x(chng)l就是算?
记得我读博时写的Othello对弈软g获得?jin)世界冠军当Ӟ得第二名的h认ؓ(f)我是靠oq才打赢他,不服气地问我的程序^均每U能搜烦(ch)多少步棋Q当他发现我的Y件在搜烦(ch)效率上比他快60多倍时Q才d服输Z么在同样的机器上Q我可以多做60倍的工作呢?q是因ؓ(f)我用?jin)一个最新的法Q能够把一个指数函数{换成四个q似的表Q只要用常数旉可得到q似的答案在q个例子中,是否用对法才是能否赢得世界冠军的关?
q记?988q贝?dng)实验室副总裁亲自来访问我的学校,目的是Z(jin)想了(jin)解ؓ(f)什么他们的语音识别pȝ比我开发的慢几十倍,而且Q在扩大臛_词汇pȝ后,速度差异更有几百倍之多他们虽然买?jin)几台超U计机Q勉pȝ跑了(jin)hQ但q么늚计算资源让他们的产品部门很反感,因ؓ(f)昂贵的技术是没有应用前景的在与他们探讨的q程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programmingQ居然被他们做成?jin)O(n*n*m)更惊讶的是,他们q(sh)ؓ(f)此发表了(jin)不少文章Q甚至ؓ(f)自己的算法v?jin)一个很特别的名字,q将法提名C个科学会(x)议里Q希望能得到大奖当时Q贝?dng)实验室的研I员当然l顶聪明Q但他们全都是学数学物理或电(sh)机出w,从未学过计算机科学或法Q才犯了(jin)q么基本的错误我想那些h以后再也不会(x)嘲笑学计机U学的h?jin)?
|络时代的算?
有h也许?x)说Q今天计机q么快,法q重要吗?其实永远不会(x)有太快的计算机,因ؓ(f)我们M(x)惛_新的应用虽然在摩?dng)定律的作用下,计算机的计算能力每年都在飞快增长Qh(hun)g在不断下降可我们不要忘记Q需要处理的信息量更是呈指数U的增长现在每h每天都会(x)创造出大量数据Q照片,视频Q语韻I文本{等Q日益先q的记录和存储手D我们每个人的信息量都在爆炸式的增长互联网的信息流量和日志定w也在飞快增长在科学研I方面,随着研究手段的进步,数据量更是达C(jin)前所未有的程度无论是三维囑Ş量数据处理机器学习(fn)语音识别Q都需要极大的计算量在|络时代Q越来越多的?xi)战需要靠卓越的算法来解决
再D另一个网l时代的例子在互联网和手机搜索上Q如果要Nq的咖啡店,那么搜烦(ch)引擎该怎么处理q个h?
最单的办法是把整个城?jng)的咖啡馆都扑և?然后计算出它们的所在位|与你之间的距离,再进行排?然后q回最q的l果但该如何计算距离呢?图论里有不少法可以解决q个问题
q么做也许是最直观的,但绝对不是最q速的如果一个城?jng)只有?f)C多的咖啡?那这么做应该没什么问?反正计算量不大但如果一个城?jng)里有很多咖啡?又有很多用户都需要类似的搜烦(ch),那么服务器所承受的压力就大多?jin)在q种情况?我们该怎样优化法?
首先Q我们可以把整个城市(jng)的咖啡馆做一ơ预处理比如Q把一个城?jng)分成若q个格子(grid),然后Ҏ(gu)用户所在的位置把他攑ֈ某一个格子里Q只Ҏ(gu)子里的咖啡馆q行距离排序
问题又来?jin),如果格子大小一P那么l大多数l果都可能出现在?jng)中心(j)的一个格子里Q而郊区的格子里只有极的l果在这U情况下Q我们应该把?jng)中心(j)多分出几个格子更进一步,格子应该是一个树(wi)l构Q最层是一个大格整个城?jng),然后逐层下降Q格子越来越,q样有利于用戯行精搜索如果在最底层的格子里搜烦(ch)l果不多Q用户可以逐上升Q放大搜索范?
上述法对咖啡馆的例子很实用Q但是它h通用性吗Q答案是否定的把咖啡馆抽象一下,它是一个点Q如果要搜烦(ch)一个面该怎么办呢Q比如,用户惛_一个水库玩Q而一个水库有好几个入口,那么哪一个离用户最q呢Q这个时候,上述?wi)结构就要改成r-tree,因ؓ(f)?wi)中间的每一个节炚w是一个范_(d)一个有边界的范_(d)参考:(x)http://www.cs.umd.edu/~hjs/rtrees/index.htmlQ?
通过q个例子,我们看到Q应用程序的要求千变?sh)化Q很多时候需要把一个复杂的问题分解成若q简单的问题,然后再选用合适的法和数据结?
q行法QGoogle的核?j)优?
上面的例子在Google里就要算是小case?jin)!每天Google的网站要处理十亿个以上的搜烦(ch)QGMail要储存几千万用户?G邮箱QGoogle Earth要让数十万用户同时在整个地球上遨游,q将合适的囄l过互联|提交给每个用户如果没有好的法Q这些应用都无法成ؓ(f)现实
在这些的应用中,哪怕是最基本的问题都?x)给传统的计带来很大的挑(xi)战(sh)如Q每天都有十亿以上的用户讉KGoogle的网站,使用Google的服务,也生很多很多的日志QLogQ因为Log每分每秒都在飞速增加,我们必须有聪明的办法来进行处理我曄在面试中问过关于如何对logq行一些分析处理的问题Q有很多面试者的回答虽然在逻辑上正,但在实际应用中是几乎不可行的按照他们的算法,即便用上几万台机器,我们的处理速度都跟不上数据产生的速度
那么Google是如何解册些问题的呢?
首先Q在|络时代Q就有最好的法Q也要能在ƈ行计的环境下执行在Google的数据中?j),我们使用的是大的ƈ行计机但传l的q行法q行Ӟ效率?x)在增加机器数量后迅速降低,也就是说Q十台机器如果有五倍的效果Q增加到一千台时也许就只有几十倍的效果q种事倍功半的代h(hun)是没有哪家公司可以负担得L(fng)而且Q在许多q行法中,只要一个结点犯错误Q所有计都?x)前功尽?
那么Google是如何开发出既有效率又能定w的ƈ行计的呢?
Google最资深的计机U学家Jeff Dean认识刎ͼ Google 所需的绝大部分数据处理都可以归结Z个简单的q行法QMap and ReduceQ?a >http://labs.google.com/papers/mapreduce.htmlQ?q个法能够在很多种计算中达到相当高的效率,而且是可扩展的(也就是说Q一千台机器q不能辑ֈ一千倍的效果Q至也可以辑ֈ几百倍的效果QMap and Reduce的另外一大特色是它可以利用大批廉L(fng)机器l成功能强大的server farm最后,它的定w性能异常?gu)Q就一个server farm里面的机器down掉一半,整个farm依然能够q行正是因ؓ(f)q个天才的认?才有?jin)Map and Reduce法借助该算法,Google几乎能无限地增加计算量,与日新月异的互联|应用一同成?
法q不局限于计算机和|络
举一个计机领域外的例子Q在高能物理研究斚wQ很多实验每U钟都生几个TB的数据量但因为处理能力和存储能力的不IU学家不得不把绝大部分未l处理的数据丢弃掉可大家要知道,新元素的信息很有可能p在我们来不及(qing)处理的数据里面同L(fng)Q在其他M领域里,法都可以改变(sh)hcȝ生活例如人类基因的研IӞ可能因为算法而发明新的医疗方式在国家安全领域Q有效的法可能避免下一?11的发生在气象斚wQ算法可以更好地预测未来天灾的发生,以拯救生?
所以,如果你把计算机的发展攑ֈ应用和数据飞速增长的大环境下Q你一定会(x)发现Q算法的重要性不是在日益减小Q而是在日益加?
l程序员的七个徏?
Q?Q练内功不要只花功夫学习(fn)各种行的编E语a和工P以及(qing)某些公司招聘q告上要求的U目要把数据l构法数据库操作系l原理计机体系l构计算机网l,L数学{基评学好大家不妨试试高dUx(chng)著The Art of Computer Programming里的题目Q如果你能够解决其中的大部分题目Q就说明你在法斚w有一定的功力?
Q?Q多实战通过~程的实战积累经验m固知识很多中国大学毕业生~Z~程和调试经验;学习(fn)C语言Q考试q关q学会(x)?jin);N目中,只要E序能够~译Q运行,q且输入输出满要求q?jin)事q些做法是不行的写程序的时候,大家必须多想惛_何把E序写得更加_高效高质量徏议大家争取在大学四年中积累编写十万行代码的经验我们必L白的是:(x)好程序员是写出来的,不是学出来的
Q?Q求实干不要轻视M实际工作Q比如一些看似简单的~码或测试要不懈q求对细节一丝不苟的实干作风与敬业精我发现不少E序员对于知识的掌握很肤,不求甚解Q没有好奇心(j)Q不?x)刨栚w底比如,学会(x)?jin)C++Q是否了(jin)解一个对象在~译后,在汇~代码中是如何被初始化的Q这个对象的各个成员在内存(sh)是如何存攄Q当一个成员函数被调用Ӟ~译器在汇编代码中加入了(jin)哪些额外的动作?虚函数的调用是如何实现的? q些东西恐怕在~程语言或编译原理中都没有详l提刎ͼ只有通过t实的实q才能真正掌?
Q?Q重视数学学?fn)数学是思维的体操,数学无处不在学计机臛_要学?fn)离散数学概率论布尔代数集合论和数理逻辑q些知识q不难,但是对你未来的工作帮助会(x)很大 其当你对一些数学密集型的领域如视频囑փ处理{有兴趣Ӟq些知识成Z手中的利?
Q?Q培d队精,学会(x)与h合作今天的Y件工E早已经不是一个h可以单独操作的,而必靠团队合作才能成功不懂得合作的人是不能成大器的大家要多d扑֏以与Z起做目的机?
Q?Q激励创新意识,培养好奇?j),不要死记背没有掌握某种法技术的Ҏ(gu)原理Q就不会(x)有应变和创新的能力想成ؓ(f)一位好E序员(其实从事M一个行业都是如此)(j)Q重要的是要LȝQ好奇,创新Q动手,合作的优U?fn)惯Q不满于填鸭,不满于考试交差Q不满于表象这不是学几门课能够一y而就?
Q?Q有{略地打工在不媄(jing)响学业的前提下,L真正有意义的暑期工作或兼职去找一个重视技术的公司Q在一个好的老板指导下完成真正会(x)被用户用的E序不要急于M个要你做头而独挡一面的地方Q因为向别h学习(fn)才是你的目的扑ַ作也是一P不要只看待遇和职衔,要挑(xi)一个你能够学习(fn)的环境,一个愿意培d工的企业Q一个重视你的专业的公司最后,q要?xi)一个好老板
希望大家都能把握Z(x)Q养成好的学?fn)?fn)惯,把算法学_֭透;希望大家都能有一个美好的未来Q?
该回复于2008-05-14 08:25:19被管理员删除 The Art of Computer Programming Vol.1 (中文译作计算机编E的艺术计算机程序设计技?--Basic Algorithms(基础法)
q部书被誉ؓ(f)20世纪最重要?0部著作之一Q与Einstein的相对论q列Q计算机科学领域的权威著作全书共分5P目前已经出版?Pq是它的W一卷基法Q包含了(jin)我们常用的算法及(qing)其相x(chng)据结构作者高L(fng)(Donald E. Knuth)是美国Stanford大学计算机科学系的退休教授,在计机U学领域享有崇高的威?nbsp;
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/zdl1016/archive/2009/09/27/4602750.aspx
问题Q还有更快的办法吗?请仔l观察第一D代码,看得出哪个特点可以利用不Q?br>
关键在那个通项公式Q?n1+n2)*(n2-n1+1) == n*2
q里如果先把n乘(sh)2Q然后的问题可不可以看成是因子分解?{案很明显?br>假如分解出的l果是n*2 = a*b Q?br>那就解方E组 n1+n2=a, n2-n1+1=b
即n1=(a-b+1)/2, n2=(a+b-1)/2
如果解出的结果n1和n2是整数的话(卌使a和b一奇一Ӟ(j)Q显然就得到一l解?br>而因子分解的复杂度是O(sqrt(n))Q显CZ(x)比之前第二段代码要节省非常多的时间?br>