首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

小弟我忍了很久,不得不说了,从一个排列组合说起

2012-02-11 
我忍了很久,不得不说了,从一个排列组合说起1,2,3,4四个数,排列组合,应该有24种,把这24种情况输出,这个问题

我忍了很久,不得不说了,从一个排列组合说起
1,2,3,4四个数,排列组合,应该有24种,把这24种情况输出,这个问题,当年我做24点算法的时候,已经做出来,效率自认为还可以。有次和同学较真,他认为这个很简单,有什么难的,结果想了一晚上没想出来。还有次,有人网上问,现在学C++已经“略有小成”,问谁能出几道算法,我出了这个,结果人家直接就说“这么简单,冒泡算法我还是会的”。

今天下了个汇编编译器,里面有介绍经典算法的教程,看到第一例
   经典c程序100例==1--10

【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去
      掉不满足条件的排列。 
2.程序源代码:
main()
{
int i,j,k;
printf("\n");
for(i=1;i<5;i++)    /*以下为三重循环*/
 for(j=1;j<5;j++) 
  for (k=1;k<5;k++)
   {
    if (i!=k&&i!=j&&j!=k)    /*确保i、j、k三位互不相同*/
    printf("%d,%d,%d\n",i,j,k);
   }
}
我不禁很伤心,这也能叫经典?3位是可以,4位呢,如果是1到9,九个数,9位,难道做9个for,我的那个算法不敢方法有多好,但起码可以多位扩展呀。

又有一次,网上有人问,求100以内还是多少以内素数,这个我有源代码,还是上大学的时候,让大学C老师“难堪”的一个算法,就好比说,我试完了4不是素数,难道还要试8?太傻了吧。我们人是怎么试的呀,2以后,素数都是奇数,而且,我们试的时候都是除以素数试的,52799,我们试完不能被7整除,难道我还还会试试能不能被14整除?
当年我那个方法,算10000以内是不到2秒,老师那个方法是12秒。而我把这个方法发给那个提问,而那个人说,另一个人发的那个方法(就是那种笨方法)简单,我这种,太复杂。当时我就伤心了,决定以后再不理算法。

现在工作也是,只要求任务完成的速度,这叫工作效率,根本不会考虑算法效率,没有了工作上的推动,自己对算法越来越生疏,悲哀呀

[解决办法]
首先要明白一个词:学以致用,你学习的目的在于应用,而不在于学习本身。
无论好的算法还是坏的算法,他都需要一定的成本,会产生一定的收益。如果单纯为了算法的好,导致成本高于收益,或者大大降低了收益的比例,那么这个“好”的算法就不应该用。一个高效的算法,往往意味着延长的工期和较高的维护成本,而它所产生的高效不见得那么重要,这是为什么常常“高效”的算法不受欢迎的原因。

假如你需要一个字符串匹配算法,一种方法高效,但是需要2个人月的开发和2个人月的测试,另外一个低效,但是只要2天的代码和1人星期的测试,你说我们应该选择哪个?在效率要求不那么高的情况下(一般应用都没有那么高的要求),绝大多数人都会选择后者,原因是你的客户不会因为一些微不足道的效率等你4个月。注意:除了时间的延长,由于你多花了接近4人月的时间,你还需要额外支付员工4个月的工资,而由于算法复杂性的增加,你的软件出问题和返修的几率会极大的增加。从这方面来看,你选择1将往往是得不偿失的

不结合实际应用单纯考虑“算法”的人可能是一个好的研究者,绝对不是一个好的工程师。一个好的工程师应该会分析自己的商业应用,会选择合适的算法来适应商业应用。如果你能做到这一点,你就不会不去研究算法,不会“对算法越来越生疏”,反而会研究更多的算法,达到从点(一个单一的算法)到面(众多算法,并熟悉每个算法的优劣)的境界

我觉得你悲哀是应该的,但是悲哀的方向错了

热点排行