JavaScript中的二分法插入算法
算法主体部分
var OnlineUser = {
//list : 待查找的数组
//key : 待插入的值
//order : 数组的顺序 1:从小到大 0:从大到小
//start : 开始查找的起始下标位置
//end : 开始查找的结束下标位置
//例:
//var arr1 = [17,15,15,14,14,13,13,8,8,7,7,6,5,4,3];
//var key = 8;
//var index = OnlineUser.GetPosIndex(arr1, key,0, arr1.length, 0);
GetPosIndex:function(list,key,order,start,end)
{
var index = -1;
var halfIndex = Math.abs(parseInt((end+start)/2));
if(list[halfIndex] == key) //在中位
{
index = halfIndex;
}
else if(list[halfIndex] < key && key < list[start])//在左半
{
index = OnlineUser.GetPosIndex(list, key, order, start, halfIndex);
}
else if(list[end] < key && key < list[halfIndex])//在右半
{
halfIndex ++ ;
index = OnlineUser.GetPosIndex(list, key, order, halfIndex, end);
}
else if(list[start] <= key && list[halfIndex] < key) //在左边
{
index = start;
}
else if(list[end] >= key && list[halfIndex] > key) //在右边
{
index = end + 1;
}
else //一个值都没有
{
index = 0;
}
return index;
},
Sort:function(array){
return array.sort(function(a, b){
return b - a;
});
},
GetInsIndex:function(list,key)
{
var index = 0;
//list = this.Sort(list);
for(var k=0;k<list.length;k++)
{
if(list[k] <= key)
{
index = k;
break;
}
else if(list[k] > key)
index = k+1;
else if(list[k] < key)
break;
}
return index;
}
}
完整的程序和测试页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head>
<body>
<div id ="result"></div>
</body>
<script lang="javascript">
var OnlineUser = {
//list : 待查找的数组
//key : 待插入的值
//order : 数组的顺序 1:从小到大 0:从大到小
//start : 开始查找的起始下标位置
//end : 开始查找的结束下标位置
//例:
//var arr1 = [17,15,15,14,14,13,13,8,8,7,7,6,5,4,3];
//var key = 8;
//var index = OnlineUser.GetPosIndex(arr1, key,0, arr1.length, 0);
GetPosIndex:function(list,key,order,start,end)
{
var index = -1;
var halfIndex = Math.abs(parseInt((end+start)/2)); if(list[halfIndex] == key) //在中位
{
index = halfIndex;
}
else if(list[halfIndex] < key && key < list[start])//在左半
{
index = OnlineUser.GetPosIndex(list, key, order, start, halfIndex);
}
else if(list[end] < key && key < list[halfIndex])//在右半
{
halfIndex ++ ;
index = OnlineUser.GetPosIndex(list, key, order, halfIndex, end);
}
else if(list[start] <= key && list[halfIndex] < key) //在左边
{
index = start;
}
else if(list[end] >= key && list[halfIndex] > key) //在右边
{
index = end + 1;
}
else //一个值都没有
{
index = 0;
}
return index;
},
Sort:function(array){
return array.sort(function(a, b){
return b - a;
});
},
GetInsIndex:function(list,key)
{
var index = 0;
//list = this.Sort(list);
for(var k=0;k<list.length;k++)
{
if(list[k] <= key)
{
index = k;
break;
}
else if(list[k] > key)
index = k+1;
else if(list[k] < key)
break;
}
return index;
}
} var result = document.getElementById("result");
//测试用例,子数组第一个为从小到大顺序,第二个从大到小的顺序
var testArray = [
[[],[]],
[[1],[1]],
[[1,2,3,4,5],[17,15,14,13]],
[[11,12,13,14,15],[7,6,5,4,3,2,1]],
[[1,2,3,4,5,7,7,7,8,8,9,9,10],[17,15,15,14,14,13,13,8,8,7,7,6,5,4,3]],
[[1000003,1000003,1000003,1000003,1000003,11000269],[11000269,1000003,1000003,1000003,1000003,1000003]]
]; //期望值
var expectArray = [
[[0],[0]],
[[1],[0]],
[[5],[4]],
[[0],[0]],
[[10],[7]],
[[5],[1]]
]; //各用例要查找的值
var testKey = [
[8],
[8],
[8],
[8],
[8],
[1000003]
]; var start =0;//开始查找的起始下标位置
var end =0; //开始查找的结束下标位置
var index = 0; //待插入的位置 for(var i=0;i<testArray.length;i++) //组数
{
result.innerHTML += "<hr />";
for(var j=0;j<testArray[i].length;j++) //组单元
{
if(j==1) //大到小
{
start = 0;
end = testArray[i][j].length - 1;
index = OnlineUser.GetPosIndex(testArray[i][j], testKey[i][0],1, start, end);
result.innerHTML += "<br />small -> big: ["+testArray[i][j].toString()+"], key:"+testKey[i]+", index:" + index +", expect:"+expectArray[i][j]+ ((index == expectArray[i][j])?"":",<font color='red'>NotEq</font>");
}
else //从小到大
{
continue;
start = testArray[i][j].length - 1;
end = 0;
index = OnlineUser.GetPosIndex(testArray[i][j], testKey[i][0],0, start, end);
result.innerHTML += "<br />big <- small: ["+testArray[i][j].toString()+"], key:"+testKey[i]+", index:" + index+", expect:"+expectArray[i][j]+ ((index == expectArray[i][j])?"":",<font color='red'>NotEq</font>");
}
}
}
/* */ //构造测试数据
var bufferArray = [];
var newArray = [10002107,10002107,10000003,10002057,10000037,10000037,10000007,10000007,10000007,10000007,10000007,10000007,10000007,10000007,10002067,10000005,10000005,10000005,10000007,10000007,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005,10000005];
newArray.reverse();
for(var n = 0;n<10000;n++)
{
newArray[n] = parseInt(10000000 + Math.random() * 1000000);
}
var key = parseInt(10000000 + Math.random() * 1000000); //IE弹出"是否停止运行此脚本"脚本超时时间设置
//1. 打开注册表HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Styles,如果 Styles 键不存在,创建调用 Styles 的一个新的项
//2. 创建新的 DWORD 值在此项下称为"MaxScriptStatements"并将值设置为所需的脚本语句数,如100000000 // ***************** 以下数据准确性测试 *********************
//系统法排序
var bArray = OnlineUser.Sort(newArray); //二分法插入
for(var m=0; m < newArray.length;m++)
{
var index = OnlineUser.GetPosIndex(bufferArray, newArray[m], 1,0, bufferArray.length-1);
//var index = OnlineUser.GetPosIndex(bufferArray, newArray[m], 0, bufferArray.length,0);
bufferArray.splice(index, 0, newArray[m]);
} //结果打印
var a = bufferArray.toString();
var b = bArray .toString();
result.innerHTML += "<br />Rnd:" + newArray.toString();
result.innerHTML += "<br />Dic:" + a;
result.innerHTML += "<br />Sys:" + b;
result.innerHTML += "<br /> Eq:" + (a == b); // ***************** 以下性能测试 *********************
//将数据分为5段,做采样
var keyArr = [];
for(var ki=0;ki<5;ki++)
{
keyArr.push(newArray.length * ki * 0.2);
} var cnt = 1000;
var idx =0 ;
var dateStart,dateEnd,timeSpan; //遍历方法插入
result.innerHTML += "<br />"+keyArr.toString();
result.innerHTML += "<br />GetInsIndex: ckey key idx cnt t(ms)";
for(var ckey=0;ckey<keyArr.length;ckey++)
{
dateStart = new Date(); //@@@TEST
for(var x=0;x<cnt;x++ )
{
idx = OnlineUser.GetInsIndex(bArray, bArray[keyArr[ckey]]+1);
}
dateEnd = new Date();t = dateEnd.getTime() - dateStart.getTime();
result.innerHTML +="<br />"+ckey+" "+keyArr[ckey] + " "+idx+" "+cnt+" "+t;
} cnt = 10000;
//二分法插入
result.innerHTML += "<br />GetPosIndex: ckey key idx cnt t(ms)";
for(var ckey=0;ckey<keyArr.length;ckey++)
{
dateStart = new Date(); //@@@TEST
for(var x=0;x<cnt;x++ )
{
idx = OnlineUser.GetPosIndex(bArray, bArray[keyArr[ckey]]+1,1,0,bArray.length -1 );
}
dateEnd = new Date();t = dateEnd.getTime() - dateStart.getTime();
result.innerHTML +="<br />"+ckey+" "+keyArr[ckey] + " "+idx+" "+cnt+" "+t;
}
</script>
</html>
JavaScript中的二分法插入算法的更多相关文章
- javascript中数组的常用算法深入分析
Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...
- JavaScript中的分号插入机制
原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...
- JavaScript中的不同逻辑算法结合操作解决实际多重问题以及常用函数类型
数组去重+快速排序 //老数组var arr1 = [1,2,2,3,8,6,6,4,5,5];//定义新数组var arr2 = [ ];内部可运用布尔型进行判断数组的唯一性 for(i=0;i&l ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法
前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...
- javascript中的队列结构
1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...
- JavaScript中的内存泄漏以及如何处理
随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...
随机推荐
- Redis以服务的形式启动
★期望目标:把RedisWatcher安装为windows服务. 安装完成后, 到安装目录下修改watcher.conf. 注意,任何路径都不可包含空格,中文,特殊字符,且全部使用绝对路径 ※配置文件 ...
- Android位置权限以及数组寻找索引的坑
填坑与求解惑来的. 一.Android 危险权限,来自官方文档的坑??? Android开发者都知道,Android 6.0 之前,权限申请只需要在 AndroidManifest.xml 文件中声明 ...
- HDU - 6430 Problem E. TeaTree 2018 Multi-University Training Contest 10 (LCA+枚举因子)
题意:一棵树,每个点都有自己val(1 <= val <= 1e5),而任意两个点u,v可以对lca(u,v) 产生gcd(valu,valv)的贡献,求每个点能接受到来自子树贡献的最大值 ...
- [转]毕设- 深入HBase架构解析(二)
深入HBase架构解析(二) 前言 这是<深入HBase架构解析(一)>的续,不多废话,继续.... HBase读的实现 通过前文的描述,我们知道在HBase写时,相同Cell(RowKe ...
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
/* g++ -o test test.cpp -lavformat -lavcodec -lavutil -lz -lm -lpthread -lswscale */ #include <st ...
- CSS 一个完整的例子
My first web page What this is A simple page put together using HTML. I said a simple page put toget ...
- Ubuntu系统Anaconda下载安装与切换源教程【转】
本文转载自:https://blog.csdn.net/qq_36268036/article/details/81517893 1. 下载安装: 这里选用国内清华大学的Tuna开源软件镜像站作为演示 ...
- The revocation function was unable to check revocation for the certificate
https://stackoverflow.com/questions/45556189/git-the-revocation-function-was-unable-to-check-revocat ...
- 洛谷P4311 士兵占领
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...
- XP_SP3_专业汉化版__x86_cd_x14-80404
1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso 来自 msdn itellyou 2. ...