检索算法 -- 数据结构与算法的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描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
随机推荐
- SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句
BEGIN WITH tx AS ( SELECT a.object_id ,b.name AS s ...
- UVA 12902 Reverse Polish Notation
//跟wyr学的//其实是贪心//题解稍后补上 #include<cstdio> #include<iostream> #include<cmath> #inclu ...
- python模块目录文件后续
1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...
- 3、使用Lucene实现千度搜索
1.新建Web项目 新建一个Web项目,我命名为SearchEngine,然后导入Java包: 除了上篇博客中的Jar包外,我还引入了 IKAnalyzer2012_FF.jar 包和struts2的 ...
- hdu 5623 KK's Number(dp)
问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗104)个数,每次KK都会先拿数.每 ...
- 不借助第三方jar包实现文件上传
假设实现文件上传难道非要借助第三方jar包(最经常使用的莫过于apache的commons-fileupload工具包)来实现吗?答案是否定的.以下通过样例演示在不借助第三方jar包的前提下怎样实现文 ...
- 充分利用HTML标签元素 – 简单的xtyle前端框架
xtyle框架充分利用语义化标签来做美化样式,兼容多款主流浏览器,包括IE8. xtyle框架虽然没BS这么强大,但我觉得也很实用,体积不算很大,适用于企业网站.WordPress主题.个人网站.博客 ...
- 使用UTL_SMTP发送中文电子邮件
就是在原有TOM源码的基础上修改utl_smtp.write_data中,将输出内容进行一下数据转换,这样可以保证中文输出不会出现乱码 ----------------------------- cr ...
- iOS切换window根控制器 (转)
转自linfengwenyou 在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器) 方法一: 1. appdelegate.m中 self.window = [[UIWin ...
- codevs1127
学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n 编号,i 号同学的 ...