检索算法 -- 数据结构与算法的javascript描述 第13章
检索算法-如何在列表中查找特定的值。
顺序查找
从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,它属于暴力查找技巧的一种,在执行查找时可能会访问到数据结构里的所有元素。
代码:
//版本1
function seqSearch1(arr,data){
//顺序查找
//就是循环查找 挨着一个一个查找
//v1 返回布尔值
for (var i = 0; i < arr.length; ++i) {
if (arr[i] == data) {
return true;
}
}
return false;
}
//版本二 返回下标或者-1
function seqSearch2(arr,data){
for (var i = 0; i < arr.length; ++i) {
if (arr[i] == data) {
return i;
}
}
return -1;
}
查找最大值和最小值
function findMin(arr){
var min = arr[0]
for(var i=0;i<arr.length;++i){
min = Math.min(arr[i],min)
}
return min;
}
function findMax(arr){
var min = arr[0]
for(var i=0;i<arr.length;++i){
min = Math.max(arr[i],min)
}
return min;
}
未排序查找
对于未排序的数据集来说,当被查找的数据位于数据集的起始位置时,查找是最快、最成功的
问题所在:
数据未排序的情况下,你要找一个数据就需要耗费较多时间去查找。
对于未排序的数据集来说,当被查找的数据位于数据集的起始位置时,查找是最快、最成功的。
这一想法 参照与 82理论,百分之八十的查找都是在找百分之二十的那些数据
我们将被查找的元素不断的放到数据起始位置,来改变数组的排序。
使用这个方法之后,查找最频繁的元素最终会移动到数据集的起始位置,
代码:
function seqSearch3(arr,data){
for (var i = 0; i < arr.length; ++i) {
if (arr[i] == data) {
if (i > 0) {
//改变元素位置。
swap(arr,i,i-1);
}
return true;
}
}
return false;
}
function swap(arr, index, index1) {
var temp = arr[index];
arr[index] = arr[index1];
arr[index1] = temp;
}
这个版本 会不断修改数剧位置,但是有个问题,有时候数据已经在前几个位置了,但是还会被放到前面。
我们将判断该元素是否处于 20%的位置,如果处于就不调换位置。
升级版:
function seqSearch4(arr,data){
for (var i = 0; i < arr.length; ++i) {
if (arr[i] == data && i > (arr.length * 0.2)) {
swap(arr,i,0);
return true;
}
else if (arr[i] == data) {
return true;
}
}
return false;
}
二分查找
二分查找是基于有序数据的。 比顺序查找效率要高很多。
基本思路:
开始猜一个数字,将数据中间的值跟查找值比较: 会有3种情况==》猜大了 、猜小了、猜对了。如果是猜大了或者猜小了,那么可以重复对数据做处理 重新查找中间值,再做判断。
代码:
function binSearch(arr,data){
var topBound = arr.length-1;
var bottomBound = 0;
while(bottomBound<=topBound){
var mid = Math.floor((topBound + bottomBound) / 2);
if (arr[mid] < data) {
bottomBound = mid + 1;
}
else if (arr[mid] > data) {
topBound = mid - 1;
}
else {
return mid;
}
}
return -1;
}
以上就是我们的二分查找方式,不过呢,假如一堆有序数据中又多个相同的值,我们该如何得知它有几个同类呢?
增加统计方法:
//如果一个数据 34 在数组中有多个 34,34,34 那么2分发会找到中间的那个,那么无法准确告知我们有3个34
//我们需要一个统计方法 来告知有几个相同的查找值
function binCount(arr,data){
var count = 0;
var pos = binSearch(arr,data)
if(pos>-1){
++count;
for(var i=pos-1;i>0;--i){
if(arr[i]==data){
++count;
}else{
break;
}
}
for(var i=pos+1;i<arr.length;++i){
if(arr[i]==data){
++count;
}else{
break;
}
}
}
return count;
}
测试:
//生成数据的方法
function createArr(){
var nums = [];
for (var i = 0; i < 100; ++i) {
nums[i] = Math.floor(Math.random() * 101);
}
return nums;
}
var nums = createArr();
//二分查找需要数据排序
nums.sort(function(n1,n2){
return n1-n2;
})
var n=46
console.log("二分:"+ binCount(nums,46)+"个数据被找到")
检索算法 -- 数据结构与算法的javascript描述 第13章的更多相关文章
- 列表的实现-----数据结构与算法JavaScript描述 第三章
实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 排序算法 -- 数据结构与算法的javascript描述 第12章
排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...
- 字典 -- 数据结构与算法的javascript描述 第七章
字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...
- 读书笔记《数据结构与算法JavaScript描述》第一章
第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...
- 链表的实现 -- 数据结构与算法的javascript描述 第六章
链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...
- 队列的实现 -- 数据结构与算法的javascript描述 第五章
队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...
- 栈的实现 -- 数据结构与算法的javascript描述 第四章
栈 :last-in-first-out 栈有自己特殊的规则,只能 后进入的元素 ,最先被推出来,我们只需要模拟这个规则,实现这个规则就好. peek是返回栈顶元素(最后一个进入的). /** * 栈 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
随机推荐
- ubuntu登陆后一闪回到登陆界面
ubuntu登陆后一闪回到登陆界面 最后发现居然是我的环境变量配置问题........ 解决方法: 先CTRL+ALT+F1 root进去, 查看nickleo用户为什么登录失败 ca ...
- DEDE列表页调用TAG标签
[field:id function=GetTags(@me)/] 标签就可以调用出来了 只不过不带连接的,如果需要连接,请注释include\helpers\archive.helper.php文件 ...
- URL传参中文乱码encodeURI、UrlDecode
传递参数 encodeURI("url.aspx?str"+"汉字")-----------(是 URi 不是URL) 后台接收参数 Server.Url ...
- 使用float属性布局时父元素高度不能自适应的解决方法
在网页的布局过程中,经常会用到float属性来实现页面的左右布局,但是有个问题就是父元素的高度并不能根据子元素的高度自适应.比如下面这段代码: <!DOCTYPE html> <ht ...
- EditText默认不显示光标,不可编辑,点击它,进入编辑状态,光标显示
设置EditText不可编辑,光标不可见: et.setCursorVisible(false); 设置EditText可编辑,光标可见: et.setOnClickListener(new OnCl ...
- openwrt 家用备忘
- UVa 1583 - Digit Generator
A+A的每一位的数字的和=B 问你每一个B对应 的最小的A 是多少 不然输出0: #include <cstdio> #include <iostream> #include ...
- sfs
http://tieba.baidu.com/p/3397811202 http://mooc.guokr.com/post/610664/ http://home.ustc.edu.cn/~boj/ ...
- 井字棋(Tic-Tac-Toe)
井字棋介绍:https://en.wikipedia.org/wiki/Tic-tac-toe 井字棋简单,但是获胜策略却和直觉不同,四角比中间重要性要高,而且先手有很大的获胜概率获胜(先手胜:91, ...
- 【转】commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar实现文件上传
总共:一个upload.jsp,一个FileUploadServlet.java,两个文件:ImagesUploaded,ImagesUploadTemp, 一个web.xml,两个架包:common ...