数据结构-查找(顺序查找与二分查找的讲解与代码实现)

这篇具有很好参考价值的文章主要介绍了数据结构-查找(顺序查找与二分查找的讲解与代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

顺序查找概念:从表的另一端开始,一次将记录的关键字和给定值进行比较,若某个记录的关键字和给定的值相等,则查找成功,反之则查找失败。

ASL:平均查找长度

pi查找概率,ci查找次数

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

eg:序列1,2,3

查找1的次数为1概率为1/3,2为两次概率1/3,3的次数为3概率1/3 

将123的查找率*查找次数的结果累加得到 平均查找次数

数据结构-查找(顺序查找与二分查找的讲解与代码实现) 

顺序查找的代码实现:(这里我么用的顺序表查找) 

//顺序查找
typedef struct List
{
	int* data;//数据元素
	int* length;//数据长度
	int size;//有效数据个数
}List;

List* initList(int length)
{
	List* list = (List*)malloc(sizeof(List));
	list->length = length;
	list->data = (int*)malloc(sizeof(int) * length);
	list->size = 1;//size等于1的时候说明带有哨兵,后面的数据从第二个位置开始存元素。
	return list;
}

void listAdd(List* list,int data)
{
	if (list->size == list->length)//所存储的有效数据已经等于空间大小(空间已经满了)
{//这里我们重新定义一个newlength,防止开始length为0时,length*2=0;
	int newlength = list->length == 0 ? 4 : list->length * 2;
	int* tmp = (List*)realloc(list->data, newlength * sizeof(int));
	if (tmp == NULL)
	{
		printf("空间开辟失败\n");
		exit(-1);
	}
	else
	{
		list->data[list->size] = data;
		list->size++;
	}
	}
	else
	{
		list->data[list->size] = data;
		list->size++;
	}
}

void printlist(List* list)
{

	for ( int i = 0;  i <list->size ; i++)
	{
		printf("%d ->", list->data[i]);
	}
	printf("NULL\n");
}

int search(List* list, int key)
{
	int i=0;
	list->data[0] = key;
 //for循环后面没有语句只有分号时,当不满足for循环的条件后循环结束不再进行,直接进行下一语句。
	for (i = (list->size) - 1; list->data[i] != key; i--);//for循环后面没有语句的执行的时候需要添加分号,防止后面的语句直接进入for循环中。
	return i;//如果返回的为0则认为没有查找到,因为我们把要查找的元素放在了头节点当中。
}

int main()
{
	List* list = initList(5);
	listAdd(list, 1);
	listAdd(list, 2);
	listAdd(list, 3);
	listAdd(list, 4);
	listAdd(list, 5);
	printlist(list);
	printf("%d\n", search(list, 3));
	return 0;
}

顺序查找的ASL:第一个节点需要1次,第n个节点则需要n次

则总该查找的次数为Sn=n*(n+1)/2(等差数列求和公式)

每次查找的概率为1/n

所以顺序查找的ASL为:n*(n+1)/2*(1/n)=(n+1)/2 

所以时间复杂度为O(n)。

二分查找L(折半查找):

前提条件是有序序列,即每次从序列的中间开始于所要查找的元素比较,如果中间元素小于key(要查找的元素)则从中间元素的右边查找(以中间元素+1为首元素,尾元素不变,再去求mid于key相比)。同理若key<mid则要从mid的左边寻找(以中间元素-1为尾元素,首元素素不变,在去求mid于key比较),若key等于mid则返回。

代码实现:利用循环查找

//循环查找
int binarysearch(int key,List* list)
{
	int start = 0;
	int end = list->size - 1;
	int mid = 0;
	while (start<=end)/如果我们的首元素下标大于尾元素下标则说明我们已经遍历完整个序列不存在要找的元素
	{
		mid = (start + end) / 2;
		if (list->data[mid] < key)
		{
			start = mid + 1;
		}
		else if (list->data[mid]>key)
		{
			end = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;//-1表示不存在
}

递归实现二分查找:

//递归查找   1.分半2查找(左查/右查)。
int binarysearchRecursion(int key, List* list, int start, int end)
{
	//出口
	if (start == end)//每个递归都有一个终止条件相当于我们while中的start<=end,当两个下标相等时进行判断如果等于key则返回任意一个下标,如果不相等则说明没有找到
	{
		if (list->data[start]==key)
		{
			return start;
		}
		else
		{
			return -1;
		}
	}
	int mid = (start + end) / 2;
//每次查找不到进行递归,看key于mid的比较来判断如果缩小范围	
if (list->data[mid] < key)
	{
	return	binarysearchRecursion(key, list, mid+1, end);
	}
	else if (list->data[mid]>key)
	{
	return	binarysearchRecursion(key, list, start, mid - 1);
	}
	else
	{
		return mid;
	}
}

 二分查找的时间复杂度:(两个二分查找的世家复杂度相同所以我们只讲解一个即可)

我们可以把线性表堪称一颗树(因为线性表是有序的比key小的都在其坐标,比它大的都在其右边)

eg:

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

 树的查找:节点在第几层需要查找几次,h层需要查找h次(所有的算法都符合此条件)

假设有n个节点,h层==》由树的公式得到n=2^(h-1)   一棵满二叉树。

满二叉树:每一层有2^(h-1)个节点

每一层查找次数:节点个数*层数==2^(h-1)*h

每层的ASL:查找次数 *概率=1/n*2^(h-1)*h

分解求2^(h-1)*h如何用n来代替

观察得此为等差*等比数列,求法(错位相减Sn-hSn)

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

3,4式联立: 

数据结构-查找(顺序查找与二分查找的讲解与代码实现) 

 数据结构-查找(顺序查找与二分查找的讲解与代码实现)

 文章来源地址https://www.toymoban.com/news/detail-459403.html

再去×1/n得到整个顺序的ASL 

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

 再利用我们数学极限n趋向足够大的时候前面的分式可以约掉,所以结果

约等于:两个都可

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

 

顺序查找于二分查找以简略的讲完,一些图片资料与代码都借鉴于b站upTyrantLucifer

 

 

 

到了这里,关于数据结构-查找(顺序查找与二分查找的讲解与代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java【数据结构】二分查找

    🌏在 有序 数组A中,查找目标值target 🌏如果找到返回索引 🌏如果找不到返回-1 算法描述 解释 前提 给定一个内含n个元素的有序数组A,满足A0=A1=A2=·······=An-1,一个待查值target 1 设置left=0;right = n - 1 2 如果left right ,结束查找,没找到 3 设置mid = (left + right )/2,mid为中间

    2024年02月12日
    浏览(34)
  • 数据结构进阶篇 之 【二叉树顺序存储(堆)】的整体实现讲解(赋完整实现代码)

    做人要谦虚,多听听别人的意见,然后记录下来,看看谁对你有意见 3.1 向下调整算法 AdJustDown 3.2 向上调整算法 AdJustUP 3.3 堆的创建 3.3.1 向上建堆 3.3.2 向下建堆 3.3.3 堆的初始化与销毁 3.3.4 堆的插入(压栈) 3.3.5 取堆顶的数据 3.3.6 堆的删除 3.3.7 堆的数据个数 3.3.8 堆的判空

    2024年04月17日
    浏览(56)
  • 数据结构,查找算法(二分,分块,哈希)

    一、查找算法         1、二分查找:(前提条件: 必须有序的序列) 2、分块查找:(块间有序,块内无序)     索引表  +  源数据表     思路:     (1)先在索引表中确定在哪一块中     (2)再遍历这一块进行查找 //索引表 typedef  struct  {     int max; //块中最大值

    2024年02月11日
    浏览(41)
  • Java数据结构与算法:查找算法之二分查找

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎回到本专栏。在这个冰冷的季节里,我们将一同探讨Java中一种高效的查找算法——二分查找。让我们点燃知识的火花,一同解锁这个查找奇迹的秘密! 二分查找简介 二分查找,也称为折半查找,

    2024年01月21日
    浏览(33)
  • 【手撕数据结构】二分查找(好多细节)

    🌈键盘敲烂,年薪30万🌈 目录 普通版本的二分查找: right只负责控制边界(少了两次比较): 时间复杂度更稳定的版本: BSLeftmost: BSRightmost:   🏸细节1:循环判定条件是left = right ⭐细节2:mid = (left + right ) 1 原因见代码注释 改动1:while条件是left right 改动2:right = nums.len

    2024年02月05日
    浏览(34)
  • Python数据结构与算法篇(五)-- 二分查找与二分答案

    1.1 定义         二分查找又称折半查找、二分搜索、折半搜索等,是一种在静态查找表中查找特定元素的算法。         所谓静态查找表,即只能对表内的元素做查找和读取操作,不允许插入或删除元素。         使用二分查找算法,必须保证查找表中存放的是有

    2023年04月20日
    浏览(35)
  • 【数据结构与算法】python实现二分查找

    二分查找 又称折半查找,它是一种效率较高的查找方法 原理:首先,假设表中元素是按升序排列,将表中间位置记录的与查找比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的大于查找,则

    2024年02月05日
    浏览(30)
  • 数据结构和算法之二分法查找

    二分法查找,也称作 二分查找 或 折半查找 ,是一种在有序数组中快速查找特定元素的算法。它采用分治法思想,通过将问题划分为规模更小的子问题,并且通过对子问题的查找来解决原问题。 二分法查找的思路是不断地将数组一分为二,然后判断目标值在哪一部分,进而

    2024年02月09日
    浏览(29)
  • 数据结构之顺序查找

    ​ 活动地址:CSDN21天学习挑战赛 目录 数据结构概念: 算法效率: 1)时间复杂度 2)空间复杂度 顺序查找: 代码实现:    作者简介:大家好我是小唐同学(๑؂๑),大家可以叫我小唐 个人主页: 小唐同学(๑؂๑)的博客主页 系列专栏:数据结构 博友们如果也是新手入

    2024年02月13日
    浏览(44)
  • 浙大数据结构第一周01-复杂度3 二分查找

    本题要求实现二分查找算法。 函数接口定义: 其中 List 结构定义如下: L 是用户传入的一个线性表,其中 ElementType 元素可以通过、==、进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包