<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   οnclick="good()"   value=测试序列分组算法(效率约高几十倍)><br>   
  <input   type=button   οnclick="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   οnclick="good()"   value=测试序列分组算法(效率约高几十倍)><br>   
  <input   type=button   οnclick="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   οnchange="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>   
  分多少列一组(不懂可以不更改    ):<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   οnclick="jizhuangxiang()"   value=测试muyuanhua贡献的集装箱算法><br>   
  <input   type=button   οnclick="fason()"   value=测试fason贡献的算法><br>   
  <input   type=button   οnclick="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   οnchange="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>   
  分多少列一组(不懂可以不更改    ):<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   οnclick="jizhuangxiang()"   value=测试muyuanhua贡献的集装箱算法><br>   
  <input   type=button   οnclick="fason()"   value=测试fason贡献的算法><br>   
  <input   type=button   οnclick="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")   
  }