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编码时,更好的应对内存泄漏带来的问题. 概 ...
随机推荐
- 08 Spring框架 AOP (一)
首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的 ...
- LVS原理详解以及部署
linux virtual server简称LVS,Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU. ...
- 优秀 H5 案例收集 vol.1(不定期更新)
一生要历经的三种战斗http://datang.wearewer.com/ 雍正去哪儿http://news.163.com/college/special/craftsman_h5/ 比Emoji更 ...
- 大牛是怎么思考设计MySQL优化方案的?
在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 图-MySQL查询过程 一.优化的哲学 ...
- ubuntu linux 1604 编译安装tesseract-ocr 4.0
主要参考官方的编译,梳理一下整个流程 Linux The build instructions for Linux also apply to other UNIX like operating sy ...
- SubSets,SubSets2, 求数组所有子集
问题描述: Given a set of distinct integers, nums, return all possible subsets. Note: The solution set mu ...
- 编辑器上的vim插件,常用到的快捷件
[vim]常用到的插件命令 [Esc] 退出编辑(输入,插入)模式,回到命令模式中(常用)i, I进入插入模式(Insert mode):i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个 ...
- SSH登陆阿里云服务器出现Permission denied (publickey)错误解决方案
操作环境: 操作系统:Mac10.11.5 阿里云服务器:Ubuntu16.04 远程连接:SSH 注:首先我们已假设你已经自己生成了SSH秘钥,并已经配置到阿里云.绑定了自己的云服务器. 但是后来发 ...
- phpexcel: 数据导出
// 设置列名最多40个 $cols = array( "A", "B", "C", "D", "E" ...
- php将科学计算法得出的结果转换成原始数据
由于php最大只支持显示 15位因的数据运算,大于15位的2数加减乘除的数据的结果,会直接用科学计数法显示, 但在现实生活中,科学计数法不利于普通人识别,所以,本函数将:科学计数法的出的结果转换成原始 ...