集装箱算法(2)

来源:互联网 发布:连接虚拟机centos 编辑:程序博客网 时间:2024/04/30 03:49

 <center>集装箱算法(加强版,更新一次)   -   作者:沐缘华(原名:风云舞)  
  <p>  
  <table><Tr><td>  
  要输出多少列(首次测试可不更改):<input   value=5432   id=a1>  
  </td></tr>  
  <tr><td>  
  分多少列一组(首次测试可不更改):<input   value=150   id=a2>  
  </td></tr><tr><td   align=center>  
  效率秘诀“掌握两者的机器性能平衡”……  
  </td></tr><tr><td   align=center>  
  <select   id=s></select><br>  
  <input   type=button   onclick="good()"   value=测试序列分组算法(效率约高几十倍)><br>  
  <input   type=button   onclick="test()"   value=测试普通循环算法(要耐心等待回应)>  
  </td></tr></table><p>&nbsp;<p>&nbsp;<p><b>你有更快的算法实现同样的功能么?</b><p>&nbsp;<p>集装箱算法介绍:很多的东西,如果装同一个集装箱,那么集装箱容集不够时,只有扩建,但这比较耗时。但如果分成多个集装箱,只是分箱的时间,不需要扩建,所以比较剩时。加强版将字符体积缩小,则等于被装东西的体积压缩  
  <script>  
  function   good(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   fen=new   Number(a2.value)   //直接换成数字还会快些  
  var   st=Math.floor(len/fen);  
  var   yu=Math.abs(len-(fen*st))  
  var   str=new   Array(st+1),allstr=""  
   
  for(r=0;r<st;r++){   //主要算法  
  j=fen*r;str[r]=""  
  for(i=j;i<j+fen;i++){  
  str[r]+=(","+i)  
  }  
  allstr+=str[r]  
  }  
   
  if(yu!=0){   //余补足  
  str[r+1]=""  
  for(t=i;t<i+yu+1;t++){  
  str[r+1]+=(","+t)  
  }  
  allstr+=str[r+1]  
  }else{allstr+=(","+i)}   //无余如10000/200,则还会快些。  
   
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.replace(/,/g,"<option>")+"</select>";  
  alert("算法用时(主要追求/可变):"+time1+"ms,输出用时(随机配置/不可变):"+((new   Date().getTime()-mstime)-time1)+"ms")  
  }  
   
   
  function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=""  
  for(i=0;i<len+1;i++){   //常规循环  
  allstr+=(","+i)  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
  </script>

 

test的慢的原因是str+=  
   
  function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=[]  
  for(i=0;i<len+1;i++){   //常规循环  
  allstr[i]="<option>"+i  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.join("")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }

 

全部用数组、最后join??  
  精彩!速度的确比字符串累计相加要快几十倍。  
  虽然相比还是没有集装箱思路快,但效率也相差不多、编码简单了许多,期待阿信在升级一下代码。  
   
  <center>  
  <table><Tr><td>  
  要输出多少列(首次测试可不更改):<input   value=15432   id=a1>  
  </td></tr>  
  <tr><td>  
  分多少列一组(首次测试可不更改):<input   value=150   id=a2>  
  </td></tr><tr><td   align=center>  
  效率秘诀“掌握两者的机器性能平衡”……  
  </td></tr><tr><td   align=center>  
  <select   id=s></select><br>  
  <input   type=button   onclick="good()"   value=测试序列分组算法(效率约高几十倍)><br>  
  <input   type=button   onclick="test()"   value=数组join方法(效率约高几十倍)>  
  </td></tr></table><p>&nbsp;<p>&nbsp;<p><b>你有更快的算法实现同样的功能么?</b><p>&nbsp;<p>集装箱算法介绍:很多的东西,如果装同一个集装箱,那么集装箱容集不够时,只有扩建,但这比较耗时。但如果分成多个集装箱,只是分箱的时间,不需要扩建,所以比较剩时。加强版将字符体积缩小,则等于被装东西的体积压缩  
  <script>  
  function   good(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   fen=new   Number(a2.value)   //直接换成数字还会快些  
  var   st=Math.floor(len/fen);  
  var   yu=Math.abs(len-(fen*st))  
  var   str=new   Array(st+1),allstr=""  
   
  for(r=0;r<st;r++){   //主要算法  
  j=fen*r;str[r]=""  
  for(i=j;i<j+fen;i++){  
  str[r]+=(","+i)  
  }  
  allstr+=str[r]  
  }  
   
  if(yu!=0){   //余补足  
  str[r+1]=""  
  for(t=i;t<i+yu+1;t++){  
  str[r+1]+=(","+t)  
  }  
  allstr+=str[r+1]  
  }else{allstr+=(","+i)}   //无余如10000/200,则还会快些。  
   
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.replace(/,/g,"<option>")+"</select>";  
  alert("算法用时(主要追求/可变):"+time1+"ms,输出用时(随机配置/不可变):"+((new   Date().getTime()-mstime)-time1)+"ms")  
  }  
   
   
  function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=[]  
  for(i=0;i<len+1;i++){   //常规循环  
  allstr[i]="<option>"+i  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.join("")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
  </script>

 

还有  
   
  function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=[]  
  for(i=0;i<len+1;i++){   //常规循环  
  allstr[i]="<option>"+i  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.join("")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
   
  改成  
   
  function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=[]  
  for(i=0;i<len+1;i++){   //常规循环  
  allstr[i]=","+i  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.join("").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
   
  就没有意义了

 

 

我的算法  
  请相同环境的同志测试  
   
  function   scoutlin(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)    
  var   allstr1={};  
  for(i=0;i<len+1;i++){   //常规循环  
    allstr1[i]=i;  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  var   s1=[];  
  for(var   o   in   allstr1)  
      s1[o]=allstr1[o];  
  s.outerHTML="<select   id=s>"+s1.join(",").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }

 

function   test(){  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)   //直接换成数字还会快些  
  var   allstr=[]  
  for(i=0;i<len+1;i++){   //常规循环  
    allstr[i]=i;  
  }  
  time1=new   Date().getTime()-mstime     //输出  
  s.outerHTML="<select   id=s>"+allstr.join(",").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }

 

我整理了一下,大家分析分析,希望继续贡献  
   
  另外不同的任务难度(数据量的多少)下,几种算法也有明显的性能差异,没有一个能在小中量数据(1000-15000)、大量数据(15000-40000)占有绝对优越的效率优势。  
   
  <center>  
  <table>  
  <Tr><td>  
  要输出多少列(首次测试可不更改):<input   value=15000   id=a1><select   onchange="a1.value=this.value"><option   value=1000>1000最易任务<option   value=5000>5000很容易任务<option   value=10000>10000容易任务<option   value=15000   selected>15000一般任务<option   value=20000>20000困难任务<option   value=30000>30000很困难任务<option   value=40000>40000极难任务</select>  
  </td></tr>  
  <tr><td>  
  分多少列一组(不懂可以不更改&nbsp;   ):<input   value=200   id=a2>集装箱算法专用  
  </td></tr><tr><td   align=center>  
  效率秘诀“掌握两者的机器性能平衡”……  
  </td></tr><tr><td   align=center>  
  <select   id=s></select><br>  
  <input   type=button   onclick="jizhuangxiang()"   value=测试muyuanhua贡献的集装箱算法><br>  
  <input   type=button   onclick="fason()"   value=测试fason贡献的算法><br>  
  <input   type=button   onclick="scoutlin()"   value=测试scoutlin贡献的算法><br>  
  </td></tr></table>  
  <script>  
  function   jizhuangxiang(){     //muyuanhua集装箱算法  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)  
  var   fen=new   Number(a2.value)  
  var   st=Math.floor(len/fen);  
  var   yu=Math.abs(len-(fen*st))  
  var   str=new   Array(st+1),allstr=""  
  for(r=0;r<st;r++){  
  j=fen*r;str[r]=""  
  for(i=j;i<j+fen;i++){  
  str[r]+=(","+i)  
  }  
  allstr+=str[r]  
  }  
  if(yu!=0){  
  str[r+1]=""  
  for(t=i;t<i+yu+1;t++){  
  str[r+1]+=(","+t)  
  }  
  allstr+=str[r+1]}else{allstr+=(","+i)}  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+allstr.replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+((new   Date().getTime()-mstime)-time1)+"ms")  
  }  
   
  function   fason(){     //fason算法  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)  
  var   allstr=[]  
  for(i=0;i<len+1;i++){  
  allstr[i]="<option>"+i  
  }  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+allstr.join("")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
   
  function   scoutlin(){     //scoutlin算法  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)    
  var   allstr1={};  
  for(i=0;i<len+1;i++){  
    allstr1[i]=i;  
  }  
  var   s1=[];  
  for(var   o   in   allstr1)s1[o]=allstr1[o];  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+s1.join(",").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
  </script>

 

哦NO,阿信的算法在改改,改成这个样子,毫无疑问即无论是在小中数据量、大数据量下,都是最快的了!而且也是最简单的,只是不知数组是不是占了很多内存?  
   
  恐怕这一算法,应是[效率]的极限了吧?不知还有谁更快?  
   
  <center>  
  <table>  
  <Tr><td>  
  要输出多少列(首次测试可不更改):<input   value=15000   id=a1><select   onchange="a1.value=this.value"><option   value=1000>1000最易任务<option   value=5000>5000很容易任务<option   value=10000>10000容易任务<option   value=15000   selected>15000一般任务<option   value=20000>20000困难任务<option   value=30000>30000很困难任务<option   value=40000>40000极难任务</select>  
  </td></tr>  
  <tr><td>  
  分多少列一组(不懂可以不更改&nbsp;   ):<input   value=200   id=a2>集装箱算法专用  
  </td></tr><tr><td   align=center>  
  效率秘诀“掌握两者的机器性能平衡”……  
  </td></tr><tr><td   align=center>  
  <select   id=s></select><br>  
  <input   type=button   onclick="jizhuangxiang()"   value=测试muyuanhua贡献的集装箱算法><br>  
  <input   type=button   onclick="fason()"   value=测试fason贡献的算法><br>  
  <input   type=button   onclick="scoutlin()"   value=测试scoutlin贡献的算法><br>  
  </td></tr></table>  
  <script>  
  function   jizhuangxiang(){     //muyuanhua集装箱算法  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)  
  var   fen=new   Number(a2.value)  
  var   st=Math.floor(len/fen);  
  var   yu=Math.abs(len-(fen*st))  
  var   str=new   Array(st+1),allstr=""  
  for(r=0;r<st;r++){  
  j=fen*r;str[r]=""  
  for(i=j;i<j+fen;i++){  
  str[r]+=(","+i)  
  }  
  allstr+=str[r]  
  }  
  if(yu!=0){  
  str[r+1]=""  
  for(t=i;t<i+yu+1;t++){  
  str[r+1]+=(","+t)  
  }  
  allstr+=str[r+1]}else{allstr+=(","+i)}  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+allstr.replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+((new   Date().getTime()-mstime)-time1)+"ms")  
  }  
   
  function   fason(){     //fason算法改良  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)  
  var   allstr=[]  
  for(i=0;i<len+1;i++){  
  allstr[i]=i  
  }  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+allstr.join(",").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
   
  function   scoutlin(){     //scoutlin算法  
  var   mstime=new   Date().getTime()  
  var   len=new   Number(a1.value)    
  var   allstr1={};  
  for(i=0;i<len+1;i++){  
    allstr1[i]=i;  
  }  
  var   s1=[];  
  for(var   o   in   allstr1)s1[o]=allstr1[o];  
   
  time1=new   Date().getTime()-mstime  
  s.outerHTML="<select   id=s>"+s1.join(",").replace(/,/g,"<option>")+"</select>";  
  alert("算法用时:"+time1+"ms,输出用时:"+(new   Date().getTime()-mstime-time1)+"ms")  
  }  
  </script>