数据结构(顺序查找、折半查找、分块查找、散列查找)

一、顺序查找 

1、顺序查找简单但速度慢

2、适合任意存储结构,不要去有序,适应结点的动态变化

template <class T>
int SeqSearch(T A[], int n, int key)
{
	for(int i = 0; i < n; i++)
	{
		if(A[i].key == key)
		{
			return i;
		}
	}
	return -1;
}

二、折半查找

1、有序存储的前提下

2、不适应结点的动态变化

3、在快速排序的方式下实现排序然后采用折半查找的方式。

template <class T>
int BinarySearch(T A[], int n, int key)//折半查找
{
	int low, high , mid;
	low = 0; 
	high = n - 1;
	while(low <= high)
	{
		mid = (low + high)>>1;
		if(key = A[mid].key)
		{
			return mid;	
		}	
		else if(key > A[mid].key)
		{
			low = mid + 1;//查找后半部分
		}
		else
		{
			high = mid - 1;
		}
	}
	return -1;//未找到

}

三、分块查找

1、将线性表分解成若干块,块内结点任意存放,块与块之间必须排序。

2、为每一块取出关键字,然后建立索引表方式来进行查找,索引表是排序的因此可以通过折半排序方式查找关键字。 

四、散列查找

1、目的是实现O(1)的时间复杂度,理想状态下创建最大关键字的数组长度来在每个不同位置存放不同的关键字,但很显然这样的话空间会太大,因此计划采用关键字转换的函数(散列函数)的方式来将关键字映射到较小的空间上进行访问结点的下标。

2、方法一采用除留余数法:选择合适的p去除关键字值余数对应散列值(p一般选为不大于散列表长度n的最大素数。

3、方法二用数字分析法:丢弃分布不均匀的位,留下分布均匀的位作为散列值——只适用于静态的关键字值集合

4、方法三用平方取中法:计算关键字的平方值,然后从平方值的中间位置选取连续的若干位作为散列值

5、方法四用随机乘数法:用随机实数f(0,1)之间,用 f × key的小数部分乘n(散列表的长度),把整数值作为散列值。

6、

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然可以!顺序查找折半查找是两种常用的数据结构查找方法。下面是这两种方法的简要介绍: 1. 顺序查找(Sequential Search): 顺序查找也称为线性查找,是一种简单直接的方法。它按照数据元素的逻辑顺序,逐个比较数据元素,直到找到要查找的数据元素为止。顺序查找的时间复杂度为O(n),其中n是数据元素的数量。这种方法适用于数据元素有序的情况,但当数据元素无序时,效率较低。 顺序查找的基本步骤如下: * 从数据结构中的第一个元素开始逐个比较。 * 如果找到了要查找的数据元素,则返回该元素的索引位置。 * 如果遍历完整个数据结构仍未找到,则示未找到要查找的数据元素。 2. 折半查找(Binary Search): 折半查找也称为二分查找,是一种基于有序数据结构的查找方法。它每次将待查找区间一分为二,根据中间位置的数据元素与目标值进行比较,缩小查找范围,直到找到目标值或区间为空为止。折半查找的时间复杂度为O(log n),其中n是待查找区间的长度。这种方法适用于数据元素已排序的情况,特别是对效率要求较高的场景。 折半查找的基本步骤如下: * 假设当前区间的下界为low,上界为high。 * 如果low >= high,示区间内不存在目标值,查找结束。 * 在区间内找到一个中间位置mid,如果中间位置的数据元素等于目标值,则查找成功。 * 如果中间位置的数据元素小于目标值,则在左半部分继续查找。 * 如果中间位置的数据元素大于目标值,则在右半部分继续查找。 需要注意的是,折半查找的前提是数据元素已经排序。如果数据元素无序或有大量重复元素,则可能无法达到预期的查找效果。 综上所述,顺序查找折半查找各有优缺点,适用于不同的场景。选择哪种方法取决于具体需求和数据结构的特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值