儿时的编程算法心得笔记

2016-02-19 12:37 3 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐儿时的编程算法心得笔记,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

作者:火鸟 redbirdli@hotmail.com火鸟编程追求小、快、精,所以算法问题成为了我不断学习和探索的方向,现将一些心得贴出,供诸位高手批评指正,也望能有些抛砖引玉的裨益。先来看看火鸟在注册表研究中的发现(此处为过去进行时,时间约为1999-2000年之间)。 隐藏驱动器算法 a..z 用 2的n次方表示如隐藏a和c 用2的0次+2的2次=5表示
  var stmp:string;
  itmp,irun,ival:integer;
  begin
  ival:=0;
  stmp:=uppercase(edit1.text);
  for irun:=1 to length(stmp) do
  begin
  itmp:=ord(stmp[irun])-66;
  itmp:=Trunc(Ldexp(2,itmp));
  ival:=ival+itmp;
  end;
  edit2.text:=inttostr(ival);
  //以上是正向运算
  stmp:='';
  while ival 0 do
  begin
  for irun:=0 to 25 do if Ldexp(2,irun)ival then break;
  ival:=ival-Trunc(Ldexp(2,irun-1));
  stmp:=chr(65+irun)+stmp;
  end;
  edit3.Text :=stmp;点评:此法似乎无太大用途,因为其虽将各字母用同一字符表示,但有以下不足:1.字母在字串中必须唯一,即不能第二次出现同一个字母;2.返回的字符无法确定原来的排列次序。鸡肋是也!火鸟倒是想到了此法的一个用处,如您正在做一个管理系统的权限模块,可以用I、O、Q、B、M等字母表示其进货、销售、查询、数据备份和管理员维护等功能。将其经过算法处理后写入同一个字段,一来可以加密权限操作,二来可以减小字段长度。如将其转换成16进制或更高进制(火鸟建议您将16以后的数字按F代表16的概念顺序排下去)您的字段将更小也将更安全。以下是关于运算速度的问题,先声明,火鸟本学不是计算机,所以如您觉得这些问题是课本上早讲过的。不必见笑,跳过不看便是。以下是代码:procedure TForm1.Button1Click(Sender: TObject);//这是一个使用了指针的排序
  var it:array[0..39999] of integer;
  itmp,irun,iset:integer;
  pi:^integer;
  begin
  for itmp:=0 to 39999 do
  it[itmp]:=39999-itmp+Random(999);
  caption:=timetostr(time)+'-'; //开始计时
  for itmp:=0 to 39999 do
  begin
  pi:=@it[itmp];
  for irun:=itmp+1 to 39999 do
  if pi^it[irun] then pi:=@it[irun];
  iset:=it[itmp];
  it[itmp]:=pi^;
  pi^:=iset;
  end;
  caption:=caption+timetostr(time);//计时结束,在火鸟P3 533EB 128M内存中运算了7秒左右
  end;
  
  procedure TForm1.Button1Click(Sender: TObject);//这是一个未使用指针的排序
  var it:array[0..39999] of integer;
  itmp,irun,iset:integer;
  pi:integer;
  begin
  for itmp:=0 to 39999 do
  it[itmp]:=39999-itmp+Random(999);
  caption:=timetostr(time)+'-'; //开始计时
  for itmp:=0 to 39999 do
  begin
  pi:=itmp;
  for irun:=itmp+1 to 39999 do
  if it[pi]it[irun] then pi:=irun;
  iset:=it[itmp];
  it[itmp]:=it[pi];
  it[pi]:=iset;
  end;
  caption:=caption+timetostr(time);//在同样环境中运算了10秒以上
  end;
  点评:以上两种算法唯一不同之处在于,第一种在循环中运行了指针,而第二种在循环中直接对值操作,可见运用指针可以提高程序效率。
  
  procedure TForm1.Button1Click(Sender: TObject);//这是一个插入排序法
  var it:array[0..39999] of integer;
  itmp,irun,iset:integer;
  pi:integer;
  begin
  for itmp:=0 to 39999 do
  it[itmp]:=39999-itmp+Random(999);
  caption:=timetostr(time)+'-'; //开始计时
  for itmp:=1 to 39999 do
  begin
  pi:=it[itmp];
  irun:=itmp-1;
  while (pi it[irun]) and (irun-1) do
  begin
  it[irun+1]:=it[irun];
  irun:=irun-1;
  end;
  it[irun+1]:=pi;
  end;
  caption:=caption+timetostr(time);//在同样环境中运算了6-7秒
  end;
  
  如您已读懂了以上的插入排序法的代码,再来看看老美Shell早在1959年(玩笑话:好像那时我妈妈还在上托儿所)提出的插入排序法,此法也称为减小步长法:
  procedure TForm1.Button1Click(Sender: TObject);
  var it:array[0..39999] of integer;
  itmp,irun,iset:integer;
  pi:integer;
  begin
  for itmp:=0 to 39999 do
  it[itmp]:=39999-itmp+Random(999);
  caption:=timetostr(time)+'-'; //开始计时
  iset:=40000;
  while iset1 do
  begin
  iset:=iset div 2;
  itmp:=iset;
  repeat
  pi:=it[itmp];
  irun:=itmp-iset;
  while (irun-1) and (pi it[irun]) do
  begin
  it[irun+iset]:=it[irun];
  irun:=irun-iset;
  end;
  it[irun+iset]:=pi;
  itmp:=itmp+1;
  until itmp40000
  end;
  caption:=caption+timetostr(time);//在同样环境中运算不到1秒!即使将数组扩大到199999,仍然能在一秒中内完成!
  
  end;
  
  点评:火鸟以前只会用所谓“冒泡法”排序,见了Shell 真不愧为醍醐灌顶,大梦方醒。真是精巧的算法!套一句广告词“不只是快一点”你也来试试吧!作者:火鸟 redbirdli@hotmail.com通过C#实现集合类纵览.NET Collections及相关技术用Delphi建立通讯与数据交换服务器—Transceiver技术剖析(上)用Delphi建立通讯与数据交换服务器—Transceiver技术剖析(下)老东西:程序快捷方式/程序删除项/EXE自删除DIY老东西:儿时的编程算法心得笔记

来源:https://www.tulaoshi.com/n/20160219/1601332.html

延伸阅读
标签: Web开发
以下的内容是一位网友的DIV CSS编码笔记,是值得大家学习的,在实际工作与开发中,将工作中的点滴记录下来,回首这些过往,你也会收获很多,如果能在webjx.com与大家共同交流,相信进步就更快了。大家一起努力! 最近在做一个魔术网的div+css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属性。趁现在还清...
顺推法     倒推法的逆过程就是顺推法,即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值......,依次递推,直至从问题初始陈述向前推进到这个问题的解为止。     实数数列:一个实数数列共有N项,已知        &...
    首先,我们先看看这个游戏的规则,给出4个1-9之间的自然数,例如:1,5,5,5(这是很经典的一个例子哦 ^_^)。在1,5,5,5中间用+、-、*、/来运算后得到24这个数。每个数只能使用一次。如果没有计算过的基本都会被难住吧。哈哈,答案是 5*(5-1/5)。是不是很经典呢?和它类似的还有3,3,8,8。     下...
#define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.65...
《上古卷轴5 天际》经验系统算法与计算公式心得 《上古卷轴5:天际》大家都玩了这么长时间,但是大家知道经验系统是怎么算的吗?今天图老师图老师小编就为大家带来了《上古卷轴5:天际》经验系统算法与计算公式心得,非常不错的内容,想知道自己的经验是怎么算的吗?下面我们一起来看吧。 经验系统算法与计算公式: 《上古卷轴5:天际》的经...

经验教程

951

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部