检索算法 -- 数据结构与算法的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描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
随机推荐
- wxpyhon 鼠标事件例子
#encoding:utf-8 import wx import wx.aui class MyFrame(wx.Frame): def __init__(self, *args, **kwargs) ...
- bash 学习笔记(一)
尽量使用printf而不要用echo(echo再不同情况下语义不同) 整数%d,小数后6位%f,科学计数法 %e,16进制 %x 宽度限制 %8s %-15s 正数朝右对齐 负数朝左对齐:%04d\n ...
- 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】
1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...
- C#中的反射原理及应用(转)
反射的概述 反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等, ...
- 蓝桥杯 BASIC 29 高精度加法(大数)
[思路]:大数处理都一样. [AC代码]:代码细节能够美化一下. #include <iostream> #include <algorithm> #include <c ...
- MS SQL 当记录不存在时插入insert INTO not exists
INSERT INTO dbo.[T_DabaoTemp] ([PType] ,[pID] ,[NewVersion] ,[ParentC ...
- 实现在Android 多点手势识别
google 提供的API中,有个类,大家都很熟悉,GestureDetector.使用它,我们可以识别用户通常会用的手势.但是,这个类不支持多点触摸(可能 google认为没有人会在几个手指都在屏幕 ...
- 月赛-Crackhash
Crackhash 这个题目是我为月赛出的,完全仿照自mma 1st simple_hash. 这道题目比较有意思的地方在于在32位的程序中模拟了64位的算术运算. 题目的思路很清晰.要求输入全为数字 ...
- 查看linux/AIX系统内存及CPU占用百分比
1.linux下查看CPU及内存占用情况 查看内存占用百分比: [root@rusky ~]# free -m | sed -n '2p' | awk '{print "used mem i ...
- ubuntu 配置JDK环境变量
ubuntu 配置JDK环境变量 (2011-11-25 16:45:59) 转载▼ 标签: ubuntu jdk 环境变量 杂谈 分类: Linux_Ubuntu_CentOs 过程如下: 1. 先 ...