<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> <p> <p><b>你有更快的算法实现同样的功能么?</b><p> <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> <p> <p><b>你有更快的算法实现同样的功能么?</b><p> <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")
}