Profilo di qiangStrong's SpaceFotoBlogElenchiAltro ![]() | Guida |
|
Strong's SpaceThe best way to predict the future is to create it. 24 novembre [转]八卦总是比公式好看的07 febbraio Linux下C++共享库的制作和使用上面介绍的共享库制作方法只适合c,对于c++前面的方法是不行不通的,不过c++静态库的制作与使用和c是一样的。
这里有专门一篇文章介绍c++共享库的制作与使用(有点麻烦,没有验证过):
Linux下共享库的制作与使用还是使用上面的例子程序: 生成共享库(动态链接库): 动态库的使用: 在这种调用方式中,需要维护动态链接库的配置文件/etc/ld.so.conf来让动态链接库为系统所使用,通常将动态链接库所在目录名追加到动态链接库配置文件中。否则在执行相关的可执行文件的时候就会出现载入动态链接库失败的现象。在编译所引用的动态库时,可以在gcc采用 –l或-L选项或直接引用所需的动态链接库方式进行编译。在Linux里面,可以采用ldd命令来检查程序依赖共享库。不过我没有隐式调用成功过,因为在Cygwin中没有找到/etc/ld.so.conf,很奇怪。 显式调用: /***************************************** int main(int argc, char* argv[]) char str[] = {"hello world"}; void *pdlHandle; pdlHandle = dlopen("./libstr.so", RTLD_LAZY); //加载链接库/libstr.so //get function from lib pStrnlenFun = dlsym(pdlHandle, "StrNlen"); printf("The string is : %s\n", str); #>gcc -o mian2 -ldl main2.c Linux下静态链接库的制作与使用Linux 中的应用程序以以下两种方式之一链接到外部函数:要么在构建时与静态库( lib*.a)静态地链接,并且将库代码包含在该应用程序的可执行文件里;要么在运行时与共享库( lib*.so)动态地链接。通过动态链接装入器,将动态库映射进应用程序的可执行内存中。在启动应用程序之前,动态链接装入器将所需的共享目标库映射到应用程序的内存,或者使用系统共享的目标并为应用程序解析所需的外部引用。现在应用程序就可以运行了。
先介绍静态库: 静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar 是archiver的缩写。静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多的优势的原因。慢慢地,大家都喜欢使用共享函数 库了。不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。 静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新 编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想 对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数 库)的程序运行速度上快一些,大概1-5%。
假设有下面几个文件:String.h,Strlen.c,Strlnen.c: Strlen.c:函数Strlen的实现,获取给定字符串的长度; ulLength = 0; Strlnen.c:函数StrNlen的实现,获取给定字符串的长度,如果输入字符串的长度大于指定的最大长度,则返回最大长度,否者返回字符串的实际长度; int StrNlen(char *pStr, unsigned long ulMaxLen) 生成静态链接库: 静态库的使用: /***************************************** int main(int argc, char* argv[]) printf("The string is : %s\n", str); return 0; cygwin的安装以及交叉编译环境的配置(2)二、配置arm交叉编译环境 在Cygwin下配置arm-linux交叉编译环境的方法很多,简单的可以下载一些别人编译好的工具如:arm-linux-toolchain-cygwin等,解压之后把相应的文件夹拷贝到Cygwin的目录下,但是这种方法至少有两个不好的地方,一是会把Cygwin本身自带的很多东西覆盖掉,二是据说这个arm-linux-toolchain-cygwin现在的版本还不支持浮点数。所以我没有采用这种方法,而是另外方法是: 第1步.准备工作,下载如下软件包: http://lsb.blogdns.net/ezx-crosstool下载ezx-crosstool-0.5.tar.bz2
ftp://ftp.gnu.org/pub/gnu 下载如下包 binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2 gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2
http://www.kernel.org/pub/linux/kernel/v2.4/ 下载 linux-2.4.26.tar.bz2
以上几个包只有第一个是必须的, 后面几个编译的时候如果没有会自动下载,如果你网速够快的话就可以先不用下载,不过强烈建议先下载下来,这样会节省很多时间。
第2步.把下载来的ezx-crosstool-0.5.tar.bz2解包: tar xvfj ezx-crosstool-0.5.tar.bz2 会生成一个ezx-crosstool-0.5目录, 然后把预先下载的: binutils-2.15.tar.bz2 glibc-2.3.2.tar.bz2 linux-2.4.26.tar.bz2 gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.bz2 拷贝到ezx-crosstool-0.5目录的子目录下(没有预先下载则跳过此步).
第3步.编辑ezx-crosstool-0.5目录下的build.sh文件,把第5行: RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt 改成你想要的安装位置,比如要安装在/usr/arm就改成: RESULT_TOP=/usr/arm
第4步.最后一步,也是最费时间的一步: 在ezx-crosstool-0.5目录下运行: ./build.sh
然后就慢慢等吧... 我是头天下午3点左右开始安装,到第二天上午10点左右才完成。另外还要注意有足够的空间,安装好交叉编译环境的Cygwin大概有4G,我第一次就是因为空间不够,没有安装成功,白白浪费了一个晚上。
安装好之后就可以在Cygwin下进行arm-linux的交叉编译了,基本上和linux下一样,只不过在每个命令前多了一个arm-linu-,如gcc变成了arm-linux-gcc,其他的依次类推。 cygwin的安装以及交叉编译环境的配置(1)这段时间因为要把以前做的东西移植到arm平台,要用到linux平台以及arm的交叉编译环境,但是又不想安装linux系统,查了一下资料,发现Cygwin是windows平台下的的linux仿真平台,基本上能够得到所需的linux工具。初次接触这个东西,弄起来还是有点麻烦的,现把一些查到的资料整理一下,免得以后用到的时候忘掉了(资料大部分都是来自网络,如果侵犯到原作者的权利,请留言,我会马上删除的)。
一、 Cygwin Cygwin是一个用于在Windows上模拟Linux环境的软件。它可以作为那些虚拟机软件的一个部分替代品。之所以将它排在第一个来介绍,是因为它实在给我帮了很大的忙。 运行Cygwin后,你会得到一个类似Linux的Shell环境,在其中你可以使用绝大部分Linux软件和功能。如Gcc,Make,Vim,Emacs等等。总之如果你想使用某个Linux下的功能,而windows上又找不到好的替代品的话,你就可以用Cygwin。我使用的最频繁的是Gcc和Make。我经常用它们来编译一些我从网上下载的开源的工程。这些工程在Windows上编译往往很麻烦。我也用它做过X Server来连接一台真正的Linux服务器,用来测试一个用tcl/tk编写的跨平台的用户界面程序。下面,我逐步介绍Cygwin的基本用法。 Cygwin 的安装很简单,登陆www.cygwin.com,点击页面上的“Install or update now!”。首先要下载一个网络安装程序,运行后会看到如下界面:
如果你使用的版本不同,这个界面可能会稍有差异。点击下一步,选择Install from Internet。这是最常用的选项,如果你下载过本地安装包,也可以使用第 三个选项。下面以从网络上安装为例讲解,点击下一步,选择你的安装目录,下一步,选择你要存放下载的文件的目录,建议不要和你的安装目录在一起。将来如果你的安装目录出了问题,可以从这个目录重新安装而恢复。下一步是选择Internet连接方式:
如果你要使用代理的话,可以在这里设置,我使用的是直接连接。下一步,这个时候安装程序会去试图找一份所有可以使用的镜像服务器的列表,这会需要一点时间。然后你会看到如下界面:
然后你就要去选择一个对你来说最快的镜像了。这里Cygwin做得非常不好,一大堆的镜像,谁能一个个的试呢?希望以后的版本,可以在这里提供一个自动速度检测的功能。我一般使用mirrors.kernel.org这个镜像,速度快的时候,一秒20几K吧。你也可以加入自己的镜像服务器地址,不过目前为止,我没有找到在国内的镜像。再点击下一步,安装程序又要停止一会,这次他是要从你刚才选择的镜像站点下载当前所有可用的软件的列表。如果这个过程很长,你就可以取消了,因为接下来的下载会更漫长。这里再次批评一下Cygwin,取消后程序就退出了,要从新来过,这个太不方便了。下面是软件列表界面的截图:
这里要解释一下这个界面:在List的上面有4个单选按钮,它们决定了你选择安装包的策略:
右边的"View"按钮是用来选择显示方式的,分别有按“类别”显示,全部显示,部分显示,显示最新的和显示尚未安装的几种模式。 搞清楚了这些选项的含义,接下来,就是选择你想要的程序安装了。一般第一次安装,先把它默认要安装的都给装了,这包括最基本的一些东西,比如bash.之后你可以根据自己的需要选择安装,比如Gcc,Vim,make,autoconf等等。 选择好你要安装的软件后,再点击下一步,程序就开始自动安装,你可以去干干别的。 要注意的是,安装Cygwin最好准备大一点的磁盘空间,下载下来的安装文件有600多M,完全安装好大概要2.7G左右。 安装完成后,在桌面上会有一个Cygwin的图标,双击它,会出现一个windows的命令窗口,过一会,你就会见到熟悉(或者陌生)的 Linux的Shell界面。试一试ls ,是不是可以工作了?
从今往后,你就可以自由的在windows下使用Linux的软件了。基本上你能用到,cygwin都有。如果你要开发可以在两个平台上运行的程序, cygwin也是你前期试验的好地方。从互联网上下载的各种开源代码,也可以在Cygwin里编译,运行,调试。下面介绍一些使用技巧,更多地还要靠大家自己探索拉! Cygwin安装后,其根目录位于你的安装目录下。所以使用cd /,只能访问到你的安装目录,要访问硬盘上的其他文件,可以使用mount: mount D:/testdir ~/testdir 这样,你就可以在~/testdir里访问到D:/testdir里的内容了。
Cygwin是一个了不起的软件,为我节约了大量的时间。更是我了解开源软件的一个得力工具。不过它有一个缺点非常让人讨厌,就是他使用Cygwin.dll作为包装器,如果你不小心掉进了Dll Hell,就会出现很多程序不能运行,抱怨找不到某某某函数入口。遇到这种情况,建议你把C:\windows,C:\windows\system(32)下的cygwin.dll全部找出来删除,只保留在安装目录下的那个。 24 gennaio 工作年终总结好久没到这里写点什么东西了,不是没有写,只是很多东西写了不方便贴出来,索性就不更新这里了,写在自己的日记里算了。以后这里也就最多贴一些书评或者工作感受罢了。
前几天所里开员工大会要每个人都写一个年终总结,写好了顺便贴在这里,算是这半年的工作总结吧:
从七月中旬算起,我来所已经整整六个月了,在这半年中做了一些事情,遇到了很多的问题,也学到了不少东西。 刚来所里的时候,从七月中到八月底我是在看AVSM标准以及流媒体方面的资料,其中主要是在研究一个RTP/RTCP库的实现以及应用,并且把RTP/RTCP加入到AVSM播放器中,实现了一个简单的网络播放器,可以从一台主机发送码流,在另一台主机接收码流并解码播放,但播放器端没有考虑丢包的问题。 从八月底到九月中旬实现了一个高速的可靠的UDP传输程序。主要是利用了一个改写的滑动窗口算法来实现这个功能,并且把这个传输程序加入到播放器中,实现了一个基于UDP的AVSM网络播放器。 从九月中旬开始研究AVSM的系统层,协助李师兄开始AVSM手机电视联合攻关项目的研发,主要负责系统层的复用与解复用。 十月李师兄离所,所内研发人员重编,我进入系统研发组,与其他组员一起进行联合攻关项目以及东方龙流媒体手机电视的研发,我主要负责联合攻关项目编码端、播放端的解复用,东方龙流媒体手机电视的编码端。 11月中旬,实现了系统层复用与解复用的简单功能; 11月底的时候东方龙流媒体手机电视的编码端库基本完成; 12月和谢师兄一起多次到东方明珠调试联合攻关项目的系统,解决测试中遇到的各种问题,12底完成联合攻关项目的基本功能,从实时编码到系统层复用,再到信号的发送与接收、系统层的解复用、解码播放,基本流程的各个环节都打通; 1月初浦东科协完成对联合攻关项目的中期验收; 上个星期与谢师兄一起和中兴商谈好LINUX手机平台播放器库的接口并形成文档;把网络接收功能加入到东方龙流媒体手机电视的播放器中。 上面就是我这半年来做的工作,下一步要做的工作主要有两个:完善联合攻关项目的编码端;实现中兴LINUX手机平台播放器库。 总的来说,这半年虽然做的工作比较多,但是总感觉效率不是很高,原因主要是很多东西都要靠自己去摸索,没有人指引。我们现在做的很多东西都是已经很成熟的东西,别人早几年就已经做好了的,如复用解复用、播放器等,但我们以前都没有接触过,全部要从头开始摸索,这样做不但效率不高,会走很多弯路,做出来的效果也不是很好,如现在我们的播放器在音视频同步上总是不尽如人意,系统层的复用与解复用也只实现了基本的功能,而这些别的公司早就有成熟的产品和代码,我觉得我们应该与这些公司合作或者向他们购买这些产品和代码,而不是什么东西都自己来做,我们应该集中精力来做我们核心的东西,这样不但可以提高我们的工作效率,加快公司的积累,节省了成本,也能保持我们在核心产品上的优势。 13 novembre 唐德刚批注《胡适口述自传》摘录刚来上海的时候就买了这本书,但是一直没有时间看,只是每天蹲厕所的时候翻看几页。虽然还没有看完,但感觉很有意思,特别是唐德刚在每篇后面的批注。今天看到唐对《青年期的政治训练》这篇的批注,很受启发,摘录如下:
--------------------------------------------------------------------------------------------------------------------
胡适之先生这篇有关政治思想的自述,是他晚年著述中很重要的一篇。这里所谈的虽是他青年时代的故事,但也是他晚年期的夫子自道,而且是一篇对他幼年思想重新估价、从头核准、初无丝毫“修正”的夫子自道。笔者二十年前为他英文自述作导言时,也就根据这几篇而强调说,胡适思想四十年来无太大的变动。这从好处来说,是胡适思想的前后一致性;从坏处来说,则是胡适之没有进步。
青年期的胡适是被两位杰出的英美思想家——安吉尔和杜威——“洗脑”了,而且洗得相当彻底,洗到他六十多岁,还对这两位老辈称颂不置。这也就表示胡适的政治思想,终其生没有跳出安、杜二氏的框框。胡适之先生一生反对“被人家牵着鼻子走”。可是在这篇自述里,我们不也是看到那个才气纵横的青年胡适,一旦碰到安吉尔、杜威二大师,便“尽弃所学而学焉”,让他两位“牵着鼻子走”吗?适之当然不承认他被人家牵着鼻子走,因为他不自觉自己的鼻子被牵了。这并不表示他老人家没有被牵。相反的,这正表示牵人鼻子的人本事如何高强罢了。
安吉尔、杜威能在东方碰到个诚实无欺、信仰坚定、生死不渝的一世祖,马克思、恩格斯为什么就不能呢?一个民族的智慧老大之后,被侵入的新兴思想所洗脑——所谓启蒙期——并赖之而复苏,原是很自然的事。但是一直停留在洗脑程序之中,而不能跳出框框,那这个老大民族就脑脉硬化,没有进步了。
记得幼年读《左传》,读到一个小故事说:“公嚼带,使公子牛焉。公子仆,折公二齿。”在胡先生这篇自述里,我们也看到,胡适嚼带,使安、杜二人牛焉。安、杜仆,胡公折其二齿。 当然在近代中国启蒙的思想家,甚至海外的宣传家之中“折其二齿”的,正所在多有,并不只胡老师一人。所以我们要了解胡适的政治思想,先得搜搜安、杜二公的“根”(root),看看他们怎样能使我们那样有才学的胡老师,来“俯首甘为孺子牛”! 大凡一个思想家,他思想体系的建立,总跳不出他自己的民族文化传统和他智慧成长期中的时代环境。这是他的根。其后枝叶茂盛,开花结果,都是从这个根里长出来的。安、杜二氏的根是怎样长法的呢?让我们先来逐条解剖一下: 第一,他二人都是白种人。他们的文化传统白得像一条被单。他们的思想、观念,是完全从欧洲白种人的文化传统出发的。 第二,他二人都是西方扩张主义极盛时代、最富强的帝国主义国家中的上等公民。 第三,他们是上述这个社会内的“开明分子”、“社会贤达”、高级知识分子,自命为有教无类的大学者、教育家。他们的人品都是极其善良的:奉行基督,反对战争,同情弱小,同情得像贾宝玉同情刘姥姥的孙子板儿一样。 第四,他二人就同胡适之先生、张君劢先生一样,无拳无勇无钱,而又自命不凡,不甘寂寞,专门欢喜“谈政治”的“白面书生”。现在美国的费正清先生等等的社会贤达,还是属于这一类。 有了这四条框框,我们就不难看出他们所讨论的“力”、“能”、“和平”、“法律”等等概念的本质之所在了。 所谓“力”也者,在他们看来,就是英国的“力”碰到了德国的“力”。他们二力相销,两败俱伤,所以胜者也就不能发“胜利财”了。他们就未看到一旦英国的“力”碰到印度的“力”,俄国的“力”碰到中国的“力”,二力不相销,则胜利者就要发“胜利财”了。他们如果不发胜利财,胡适之先生也就没有“庚款”可以“留美”了。 所以谈近三百年来的世界问题(包括今日美、苏争霸的问题),如果抹杀“帝国主义”这个基本概念,则一切理论也就不值一驳了。 再看安、杜二氏所谈的“和平”罢! 他们的“和平”的定义,事实上是:“全世界在休战状态下,维持现状(status quo)。”第一次大战(乃至第二次大战)前后,想“维持现状”最力的国家便是“日不没”的大英帝国。她在“现状”之下,已日不没矣;不维持现状,难道还要征服火星吗? 那时想打破现状,使世界大乱,好浑水摸鱼的是德、意、日等几个小强盗。大强盗要维持现状,保护“既得利益”,小强盗要打破垄断,向大强盗分赃,才搞起了所谓“世界大战”,其理甚明。 在这情况之下,安、杜二大师要全世界休兵息战,维持现状,这不但小强盗不肯;这现状对我们这些历经大小强盗洗劫、弄得家破人亡的殖民地、半殖民地、次殖民地,又发生什么意义呢?民国初年孙中山先生反对“参战”的理论基础(我强调的是“理论”二字),也是从这个观点出发的。 安吉尔、杜威这两位白面书生,书生论政,见不及此,是可以理解的,因为他二人皆“身在此山中”。像胡适之先生这样的从半殖民地出来的黄面书生,在国际政治上也和他们大唱其同调,不是很可笑的事吗?! 杜威对“法律”所作的那两条解说,事实上和我国汉朝许慎所说的“触不直者去之”,同样没有太大的反驳价值,因为他忽略了“法律”的从属性而以偏概全。 “法律”就像一头猎犬,它是有“主人”的。杜威用数理逻辑所推出的答案,在今日政治学派上说盖可归之于“数理派”(mathematical metrical)。他这个调节不同力量、使其作有组织地更经济有效地使用这一公式,有个大前提——使用这一公式的人,必须全是“主人”。这样则一条公路上两位驾驶员,各自靠右边开车,各自经济有效地使用其“力量”而不至于“浪费”。 可是就在胡适之在美国做学生的时候,也就是杜威完成这个公式之时,美国加州却有一条管理该州公路的“法律”。那条“法律”规定在公路驾马车而过的小贩,不收费,或收费甚轻;步行挑担的小贩,则付重税,重于马车数倍。何以故呢?就是“主人”家里的人都是乘马车的。那些“挑担”的广东小贩,站都站“不直”,所以这匹野兽“NCE5C”便“触而去之”了! 笔者在50年代的中期,为着应付考试也曾熟读杜威之书。讲到“不疑处有疑”之时,我就把他一段段地开了天窗,虽然我在三重口试的考场上不敢对这个杜家店说半个不字。 后来我访问胡先生,我看他老人家无条件地服膺杜威的情形,心中亦不以为然。但是胡公虽然一辈子鼓励人家“怀疑”,他自己却不大愿意人家对他的思想有所“怀疑”。笔者因而也就未敢过分地唐突西施。可是适之先生是绝顶聪明和极度虚心的。我们的字里行间式的聊天,曾惹起胡先生用了大笔血汗存款,托我替他买了十来本研究杜威的新著。 笔者叙述这段小事,并不是说其愚如余小子者,尚敢斗胆批杜,而胡大师却不敢说半个不字!非也。这是中国学术史上的“辈分”问题。 适之先生求学于清末民初之际,那时孔家店已不倒自倒。思想界一片空白(笔者这一论断,周策纵先生是一向反对的),青年知识分子乃四出“求经”。可是这些洋“经”对他们来说,实在是太新鲜、大高明了。在泰山压顶的西风东渐之下,他们完全丧失了“学术自主”的信心(事实上也无此能力),因而新学问对他们只有“皈依”的份,哪里谈得到怀疑呢?幼年既无力怀疑,也无心怀疑,年老功成业就,已成了开山宗师,东方一世祖,自然就更不会怀疑了。这不但是实验主义者如此,马克思主义者更是如此。 我们这后一辈就有点不同了,我们第一个怀疑是那些“留学归国”在大学里教过我们的洋老师。对老师的怀疑,因而对老师的老师也就不太信任了。这就是笔者所说的“辈分问题”,倒不是后一辈胆子大,“不知轻重”。 再者,胡适之先生原是个十分标准的传统中国士大夫。传统的士大夫现代化了,因而他与英美的士大夫——英国的张君劢、美国的胡适之……也就一拍即合。后一辈的知识分子去古已远,他们的士大夫气息已经很淡薄,加以他们都是抗战、革命等空气喂大的,对洋人也就没有像老一辈子那样说一不二了。 ------------------------------------------------------------------ 正所谓文理相通,思想家哲学家是如此,工科理科也是如此。 09 novembre [转]算法人生刚才在网上找资料,发现一篇文章,写得很有意思,转录过来:
几年前的一次算法考试,准备写篇文章上去的,可惜考试的时间太短,做完那些题目后,已经没有时间了。于是写给了自己,近日翻了出来,给大家分享,请大家批评指正。
算法与人生,看上去没有什么联系,其实不然。 算法是由若干条指令组成的有穷序列。人生是由若干指令(去吃饭、去睡觉、去工作等)组成的有穷序列。
算法有零个或多个由外部提供的量作为算法的输入。人从生下来开始就不断地接收来自于自然界、社会各种信息。
算法产生至少一个量作为输出。人生当中的输出也至少有一个,包括物质的和精神的。
组成算法的每条指令是清晰的,无歧义的。组成人生的指令也是清晰的,不过由于硬件具有很大的不稳定性,执行起来会造成误差。
算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
人生中的每条指令当然也如此。
算法分析的目的在于分析算法的复杂度,从而改进算法,使算法能够使用尽量少的资源(时间、空间)完成算法的计算,得到结果。每个人的人生都有一定的目的,不管这个目的是高尚的还是庸俗的,也不管这个目的是宏伟的,还是渺小的。每个人都为了这个人生目的而奋斗,有的人在奋斗过程中不断分析,寻求更好的方式达到目的,有的人按部就班的前行。当然不会思考的人获得成功的可能性是很小的,所以相对应于算法分析,这里提出人生分析。如同算法分析一样,人生分析的目的在于分析如何目前的现状,使用最少的资源(时间、金钱等)达到自己的目标。
所以说,人生如算法,算法分析也就是人生的分析。
无论从宏观的角度来看,还是从微观的角度来看,算法中最重要的一个指令是“选择”,人生也如此。算法寻求结果是通过try出来的,人生也是try出来的,说得通俗一点,人生是摸索出来的,说得更科学一点,人生是探索出来的。如果人生的目的是排好序的,那我们没有理由从小到大一点一点去try,如果有共n个目的,那么平均要试n/2次,但以选择二分查找法去寻求自己所追求的那个目的,平均只需要logn次。可惜假设不成立,但是人生中的很多事情是可以通过二分查找法来进行改进的,大家应该知道,人生中很多事情不是只有两种答案,一种是0,还有一个是1,正确的答案往往在0和1中,而且根据不同的外部输入,答案也不同,换句话说,只有把握好了一个度,才能处理好。这样的例子人生中太多。
人生是复杂的,复杂得我不知道人生是否属于NPC,或者说这里用“属于”这个词是否正确我都不能明确。但有一点可以确信,人生中应用了各种算法。
分治算法。这是用得最多的,而且也是最直观的。社会的进步,造成了社会的复杂,复杂得依靠个人能力已经不能去解决,那么此时,我们通常采用的方法就是,大事化小,小事化了(呵呵,后半句不要)。为什么化小啊,为了小到能够让个人能够去完成啊,是不是只要化小就可以了呢?当然不是,划分时还得注意划分的规模,如果一件事情需要10天完成,你分给A、B两个人,A,70%, B,30%,那么最终需要7天才能完成,如果A,50%, B,50%,那么5天就能完成。还有一点要注意,A和B的工作完成后要能够准确的接上。呵呵,这是管理学中的方法,其实这就是分治了。分而治之,治而合之。
动态规划。货郎担问题够通俗话了吧。什么,你没有用到,呵呵,其实每个人在无形中都用到了该算法(计算得准不准确另当别论)。比如有时候想上街去买东西,要去一个地方买鞋子,还要去另外一个地方买衣服,再去另一个地方买点吃的,最后回家,出门前你都会盘算一下应该先去哪里,再去哪里,怎样走线路会更近一点,会节约更多的时间。这个时候你就用到了动态规划。忘了说非常非常重要的一点,动态规划在计算过程中一定要保留已经计算过的数据,避免重复计算。没有这一点,就是穷举算法,有了这一点就是动态规划算法,没有这一点,你也能成功,但是你的花100年,有了这一点,你可能只需花10年。人生何其短,有多少时间能让你重复计算?
贪心算法。拥有贪心算法思想的人肯定不是一个战略家,因为他只注重当前利益。不过拥有贪心算法思想的人肯定是一个最开心的人,因为他得到的总是当前最好的。在这个世界上,我想大多数人和我一样贪心。
回溯法和分支界定法。这两个算法是体现try思想最明显的了。不就是解决问题吗,我去先去按这条路走一走,走不通,再试一试走另一条路,呵呵,走通了,这个方法是最好的方法吗,还有没有更好的,在去试,试,试,呵呵,找到一个更好的方法,难道人生不是这样的吗?不过有一点要注意,不要盲目的试,要学会在试之前对这种方法进行判断,如果明显不行,就没有必要再试了,以免浪费时间。
虽然人生如算法,可是千万别严格的按照算法去生活,当你每天一成不变的按照你计算的从家到公司最近的线路来来回回的时候,不妨偶尔绕绕路,你会发现不同的风景,毕竟,我们是在生活,不是在做算法考试,不会因为没有达到最优而扣你的分:)
|
||||||
|
|