检索算法 -- 数据结构与算法的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描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
随机推荐
- Node.js 参考学习地址
前段时间研究过Node.js 自从由于笔记本硬盘崩了之后就很少在家里搞程序了,但是很想学习之,只因最近在努力学习英文.技术之外的事也需要做好,我们毕竟不是为了技术而生,技术是我们生存的一门得力技能,唯 ...
- hdu 1754 I Hate It_线段树
题意:略 思路:套hdu1166模版改改就行了,要注意的是,网上有的代码是错的,还贴出来... #include <iostream> #include<cstdio> #in ...
- [IOS]UIWebView 请求网络页面或者加载本地资源页面
UIWebView是一个能够显示网页的IOS视图控件,我们可以用它来访问一个网站.下面是具体的实例: 操作步骤: 1.首先在xib文件中拖放一个UIWebView控件到view中 2.将下载的页面以及 ...
- Pet(dfs+vector)
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- eclipse搭建Log4J日志环境
在hibernate使用的日志标准都为slf,slf可以看作为它的接口,因此需要找到它的实例,为我们做日志.我们选择使用log4j为实例. 1. 为防止冲突,先将slf4j-nop的jar包(它也是s ...
- RequiredFieldValidator验证下拉列表框
<asp:DropDownList ID="DropDownList1" runat="server" CssClass="style01&qu ...
- AES 加密,C#后台,javascript前台,crypt-js
javascript前台代码 <script src="http://apps.bdimg.com/libs/crypto-js/3.1.2/components/core-min.j ...
- android系统将普通应用升级为系统应用
作为一名程序员,有的时候并不是使用软件,而是去改造软件,不仅仅只是会编程而已,还要满足客户的需求.这样,才能开发出符合客户需求的应用,在关于到涉及到android底层的应用的时候,手机就需要root了 ...
- Android布局(一)layout_gravity 属性和 gravity属性的区别
安卓中的 layout_gravity 属性和 gravity属性 有啥区别? LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravi ...
- EXT属性
Extjs & Ext.Net 弹出整个浏览器对话框的方法 top.Ext.Msg.alert("值"); top.Ext.Msg.confirm("值" ...