查找【应用篇】

查找

一、查找的基本概念

  1、动态查找表在查找过程中插入元素或者从查找表中删除元素,

  2、静态查找表只是查找特定元素或者检索特定元素的属性。

  3、通俗的说,动态查找表可以对查找表结构进行修改,而静态查找表只是查询。

  4、顺序存储和链式存储方式都支持线性查找。

  5、二分查找时,数据必须以顺序方式查找,而且必须有序。若是链式存储,则只能支持顺序查找。若是数据无序,则不能二分查找。

  6、要进行散列查找,则元素必须以散列方式进行存储。
 
二、顺序查找法

  1、顺序查找的算法

    1)数组实现   

采用顺序表来存储线性表,实现顺序查找算法
#include"SeqList.h"
int SeqSearch(SeqList &L, DataType x)
{
	int i = 0;
	DataType temp;
	while(i<L.n && L.data[i] != x)
		i++;
	if(i == L.n)
		return 0;
	else
	{
		if(i > 0)
		{
			temp = L.data[i-1];
			L.data[i-1] = L.data[i];
			L.data[i] = temp;
			return i;
		}
	}
}

    2)链表实现   

采用带头借点的线性链表存储线性表,实现顺序查找算法
#include"LinkList.h"
LinkNode *LinkSearch(LinkList &L, DataType x)
{
	LinkNode *p = l-> Link,
		*pre = L, *ppre = NULL;
	while(p != NULL && p->data != x)
	{
		ppre = pre;
		pre = p;
		p = p->link;
	}
	if(p != NULL && pre != L)
	{
		pre->link = p->link;
		p->link = pre;
		ppre->link = p;
	}
	return p;
} 

  2、顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度为O(n)

三、折半查找法

  1、折半查找的算法 

设计一个递归算法,实现在有序顺序表上的折半查找
int binarySearch(seqLIst &L, DataType x, int left, int right)
{
	int mid = -1;
	if(left <= right)
	{
		mid = (left+right)/2;
		if(x > data[mid])
			mid = binarySearch(L, x, mid+1, right);
			else if(x < data[mid])
				mid = binarySearch(L, x, left, mid-1);
	}
	return mid;
};

  

  2、有一个有序表为{1, 3, 9, 12, 32, 41, 45, 62, 75, 77, 82, 95,100},当折半查找值为 82 的结点时,

    4 次比较后查找成功。

   

  3、设有序顺序表中的元素依次为 017, 094, 154, 170, 275, 503, 509, 512,553, 612, 677, 765, 897, 908。试画出

    对其进行折半搜索时的二叉搜索树(即二分查找树),并计算搜索成功的平均搜索长度和搜索不成功的平均搜索长度。

    

  4、假定对有序表:(3, 4, 5, 7, 24, 30, 42, 54, 63, 72, 87, 95)进行折半查找,试回答下列问题:

    (1). 画出描述折半查找过程的判定树;

    (2). 若查找元素 54,需依次与哪些元素比较?

    (3). 若查找元素 90,需依次与哪些元素比较?

    (4). 假定每个元素的查找概率相等,求查找成功时的平均查找长度。

    

四、散列表

  1、散列表基本概念  

散列表,它在元素的存储位置与元素关键码间建立一个确定的对应函数关系,使每个关键码与结构中的一个唯一的存储位置相对应

常见的散列函数
定义域必须包括需要存储的全部关键码,其值域必须在0到m-1之间
1、直接定址法
hash(key) = a*key+b
2、除留余数法
设散列表中允许的地址范围为0 ~m-1,取一个不大于m,但是最接近于或等于m的质数p作为除数,利用公式hash(key) = key % p(p<=m),要求这时的质数p不是接近2的幂的数、

解决冲突的开地址法
1、线性探测
使用某一个散列函数计算出初始散列地址,一旦发生冲突,在表中顺次向后寻找下一个空闲位置的公式为

2、二次探测
使用二次探测法,在表中寻找“下一个”空闲位置的公式

解决冲突的拉链法
例如设给出一组元素的关键码为37,25,14,36,49,68,57,11,取m = 11,采取拉链法解决冲突,散列函数为Hash(x) = x % 11,则各关键码计算出的地址为

散列表的装填因子@的定义为;
	@ = 表中已装有的记录数n/表中预设的最大记录数m

  2、

  

 3、

  

  

  4、

  

  

    

 

    

 

  

  

时间: 2024-10-12 15:46:38

查找【应用篇】的相关文章

js查找一篇英文文章中出现频率最高的单词

下面这个函数是js查找一篇英文文章中出现频率最高的单词(由26个英文字母大小写构成),输出该单词及出现次数,不区分大小写,主要是正则的运用: function counts(article){ article = article.trim().toUpperCase(); var array = article.match(/[A-z]+/g); article = " "+array.join(" ")+" "; var max = 0,wor

二分查找专题总结 - 基础篇

二分查找 - 基础篇 前言 从一个有序的数组中,找到某元素的值,通常思路就是二分查找.二分查找是一个常考的知识点.同时,它也是非常容易出错的一道面试题.左右指针的位置,取值,比较是大于还是大于等于.里面细节很多.死记硬背往往容易出错,只有真正理解思路和多多练习,才能掌握不出错的"二分算法". 本篇文章是二分查找的入门篇.将会介绍最传统,最容易理解与书写的二分算法.并介绍四种二分查找的进阶问题.在理解本文的基础上,后续文章将会再分享二分的各种变形和其他模板. 原题:在有序数组中查找定值

C#OOP之八 继承 接口和抽象类

继承 在现实生活中有所谓的"种瓜得瓜.种豆得豆"的说法,在生物学概念上就是"遗传"的概念,在面向对象中"继承"就类似于生物学中的遗传,通过继承,可以更好的实现代码的重用(复用,多次使用的意思).增加扩展性.简化代码等. 下面是现实生活中的引用: 定义与使用继承 继承一次最常用的就是通过合法程序(比如遗嘱)从别人那里接受财产或爵位等,有点类似于世袭制. 另外一个含义,是人从父母那里继承一些特征,如果孩子从父母继承的身高.相貌等特征.那么在什么情况下

MVC三层架构在各框架中的特征

转一篇写得很棒的文章:https://my.oschina.net/win199176/blog/208171?p=7&temp=1495894148424 1.基于web开发中最原始的jsp+Servlet   图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端接收到的信息通过封装技术进行解析,在交给web

Laravel 5系列教程五:MVC的基本流程

免费视频教程地址https://laravist.com/series/laravel-5-basic 期间受到很多私事影响,终于还是要好好写写laravel的教程了. 上一篇我们说了数据库和Eloquent的基本用法,如计划一样,这一篇文章我们说说Laravel中Model,Controller,Views的工作流程,也就是下面这个顺序: 1.注册路由 ---> 2.创建控制器 ---> 3. 控制器中获取数据库数据 ---> 4.在视图中展示数据 英文的表达可能会更加贴切一点: 1.

dedecms如何利用tag来调取相关文章

DEDE文章里,很多人都是只填了TAG,而没有填写关键字,更不要说手动去设置其相关文章了. 所以,就希望有一个功能,可以列出当前文章的按TAG进行相关匹配的文章,作为其相关文章. 例如:A文章的tag是"证券 金融 次贷",B文的TAG是"美女 时尚",C文的TAG是"美女 次贷",D文的tag是"证券 贬值",那么A文章用次此修改后得到的相关文章就是C和D,B文的相关文章是C,C文的相关文章是A和B,D文相关文章是A 修改方

Gerrit审核服务器搭建简易教程(Ubuntu 12.10)

原文出处:http://www.linuxidc.com/Linux/2013-02/79999.htm 1.安装Ubuntu12.xx(本人使用的是12.10,其他版本未测试) 2.配置java环境 下载jdk-6u34-linux-x64.bin(百度google),终端中执行安装(如没有权限,则执行 chmod a+x jdk-6u34-linux-x64.bin) $: ./jdk-6u34-linux-x64.bin 安装会自动执行.安装完后,配置相关环境变量 $: vim ~/.ba

网站排名最快最实用的三个技巧

网站排名最快最实用的三个技巧 如何让网站更快的获取排名,缩短关键词排名的周期,提升网站更多的流量入口,只需要了解搜索引擎的规则. 一个网站做关键词排名,一切都围绕这个目的,任何操作都是要获的排名. 1.综合评分: 网站各项数据指标具体指:基础代码优化,网站布局拉网等等. 百度统计:跳出率,停留时间在综合评分里在很大比重, 跳出率太高了怎么处理?比如小说类型网跳出率很低,电影网站是停留时间,问答类跳出率就高. 跳出率取决内链是否做得好?推荐是否是用户需要的? 随便打开一个网站,查找一篇资料后会有相

Laravel教程 五:MVC的基本流程

Laravel教程 五:MVC的基本流程 此文章为原创文章,未经同意,禁止转载. Controller 期间受到很多私事影响,终于还是要好好写写laravel的教程了. 上一篇我们说了数据库和Eloquent的基本用法,如计划一样,这一篇文章我们说说Laravel中Model,Controller,Views的工作流程,也就是下面这个顺序: 1.注册路由 ---> 2.创建控制器 ---> 3. 控制器中获取数据库数据 ---> 4.在视图中展示数据 英文的表达可能会更加贴切一点: 1.

Android之4.0新特性

Android 4.0 平台 API等级:14  Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题带给了小屏幕设备,因此我们说 Android 4.0 是一次重要的平台发布版.作为一名开发者,现在你拥有了单一的平台和统一的 API 框架,使你可以开发,并通过一个APK 来发布你的应用程序,并且可以为运行相同版本 Android(Android 4