ListSet_对半搜索的迭代算法

折半查找的递归算法 设计一个折半查找算法。要求用C/C++递归实现。 立即下载
递归函数效率低, 常使用相应的迭代算法.

mid, left, right均为元素下标, 如果当前表不为空, 则令x与l[mid]比较. 若两者相等, 则搜索成功. 若前者小于后者, 则继续查找左半部分, 否

则查找右半部分. 下标范围分别为[left, mid - 1], [mid + 1, right]. 如果当前搜索表为空表, 搜索失败返回NotPresent.


实现代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "assert.h"
using namespace std;
const int MAXN = 9999;

enum ResultCode
{
    Underflow, Overflow, Success, Duplicate, NotPresent
};
template <class T>
class DynamicSet
{
public:
	virtual ResultCode Search(T &x) const = 0; // 表中搜索与x关键字相同的元素, 若存在则赋值给x并且返回Success, 否则返回NotPresent
	virtual ResultCode Insert(T &x) = 0; // 表中搜索与x关键字相同的元素, 若存在该元素, 赋值给x返回Duplicate, 若表已满返回Overflow, 若表未满返回Success
	virtual ResultCode Remove(T &x) = 0; // 表中搜索与x关键字相同的元素, 若存在该元素, 赋值给x返回Success, 否则返回NotPresent
	virtual bool IsEmpty() const = 0; // 集合为空返回true
	virtual bool IsFull() const = 0; // 集合为满返回true
	/* data */
};

template <class T>
class ListSet: public DynamicSet<T>
{
public:
	ListSet( int mSize );
	~ListSet() { delete []l; }
	bool IsEmpty() const { return n == 0; }
	bool IsFull() const { return n == maxSize; }
	ResultCode Search(T &x) const;
	ResultCode Insert(T &x);
	ResultCode Remove(T &x);
	void Print();
private:
	T *l;
	int maxSize, n;
	/* data */
};

template <class T>
void ListSet<T>::Print()
{
	for(int i = 0; i < n; ++i)
		cout << l[i] << "\t";
	cout << endl;
}

template <class T>
ListSet<T>::ListSet(int mSize)
{
	maxSize = mSize;
	l = new T[maxSize];
	n = 0;
}

template <class T>
ResultCode ListSet<T>::Insert(T &x)
{
	assert(!IsFull());
	l[n++] = x;
	l[n] = MAXN;
	return Success;
}

template <class T>
ResultCode ListSet<T>::Remove(T &x)
{

}

template <class T>
ResultCode ListSet<T>::Search(T &x) const
{
	int mid, left = 0, right = n -1;
	while(left <= right) {
		mid = (left + right) / 2;
		if(x < l[mid]) right = mid - 1;
		else if(x > l[mid]) left = mid + 1;
		else {
			x = l[mid];
			return Success;
		}
	}
	return NotPresent;
}
int main(int argc, char const *argv[])
{
	ListSet<int> ls(20);
	int x = 21; ls.Insert(x); 
	x = 30; ls.Insert(x);
 	x = 36; ls.Insert(x); 
	x = 41; ls.Insert(x);
 	x = 52; ls.Insert(x); 
	x = 54; ls.Insert(x);
	x = 66; ls.Insert(x); 
	x = 72; ls.Insert(x);
	x = 83; ls.Insert(x); 
	x = 97; ls.Insert(x);
	ls.Print();
	x = 35;
	if(ls.Search(x) == Success) cout << "Found " << x << endl;
	else cout << "Not Found " << x << endl;
	return 0;
}


Mac安装Weblogic教程 1.Weblogic的下载 这次安装的是最新版本12 官网下载地址: http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html 下载需要登录账号,如没有账号要注册一个 下载后的文件如下图,其中fmw_12.2.1.3.0_wls_quick.jar文件就是安装包了,注意现在不要对它进行解压 2.安装前的确... 阅读详情

相关推荐

IGV实战指南:从数据导入到Peak可视化的全流程解析

本文提供了一份IGV实战指南,详细解析了从数据导入到Peak可视化的全流程。内容包括软件安装、参考基因组加载、测序数据处理、信号调整以及如何精准定位和可视化Peak区域,并分享了导出出版级矢量图的高级技巧,帮助用户高效完成基因组数据可视化分析。

weixin_29212867的博客 149

折半(对半)搜索算法

二分搜索算法要求有序表采用顺序存储,其中折半搜索(又称折半搜索)是二分搜索的一个特例,设当前搜索的子表为(Aleft,Aleft+1,Aleft+2,……,Aright),令 m=(left+right)/ 2。这种二分搜索被称为对半搜索。对半搜索算法将表划分成几乎相等大小的两个字表。 下面给出对半搜索的递归算法(使用模板,具体应用时可以再进行相应修改): template int Sort

Yesterday You Said Tomorrow. 7917

Honeywell EPKS 核心功能块组态与执行调度实战解析

本文深入解析Honeywell EPKS系统的核心功能块组态与执行调度技术,涵盖控制模块(CM)、顺序控制模块(SCM)和输入输出模块(IOM)的配置方法。通过实战案例分享执行顺序(ORDERINCM)和CEE执行周期的优化策略,帮助工程师提升工业自动化系统的控制精度和运行效率。

weixin_28724319的博客 414

查找算法之二分查找(对半查找)

  当有序表采用顺序存储时,可以采用二分查找的方式查找指定关键字的元素。   二分查找的基本思想是选择表中某一位置i的元素A(i),设该元素的关键字为K(i),将K(i)与待查找关键字key比较。 关键字 k1k_1k1​ k2k_2k2​ K(3) K(4) K(5) …… K(i-1) K(i) K(i+1) …… K(n-4) K(n-3) K(n-2) K(n-1) K(n) ...

Y_JESSE的博客 8065

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7373

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 684

ListSet_对半搜索的递归算法

对半搜索是一种二分搜索, 将表划分为长度几乎相等的两个子表. 共有函数Search()调用私有函数BSearch(). 而后递归调用BSearch()函数实现对有序表的对半搜索. mid, left, right均为元素下标, 如果当前表不为空, 则令x与l[mid]比较. 若两者相等, 则搜索成功. 若前者小于后者, 则继续查找左半部分, 否 则查找右半部分. 下标范围分别为[left,

GKHack's Blog 2776

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。首先在对项目编译产生文件的属性设置为Release。 在编译完成后,找到每个CORE单独生成的DXE文件: 文件通常位于项目目录下每个core的Release文件中。安装SC589评估板的驱动(ADSP-SC5xx_EZ-KIT_Lite-Rel2.0.0.exe)后,在安装目录下可以找到SPI FLASH芯片的驱动程序(sc589_w25q128fv_dpia_Core1.dxe): 把文件copy到CCES 的目录下由于SC58x处理器的特殊性

daijingxin的博客 3730

二分法及递归和迭代

要实现二分查找我们得先确定查找的范围,其次在查找范围内,计算索引mid,同时可能会有人询问为什么是mid=left+(right-left)/2,而不是mid=(left+right)/2,这里我们需要了解的是当其定义的数很大的时候它有可能超出了int可定义的范围(我们可以试试INT_MAX这个代码求出int的最大值为2147483647),当left=INT_MAX-1的时候它们相加会溢出,导致乱码,所以我们用的是我们这个例子,防止溢出。基本情况:其终止的条件,阻止其无限递归。举相同的例子,但用迭代。

yasuniko的博客 632

S32K3 eMIOS输入捕获(ICU)全解析:从信号测量到代码实现

本文深入解析了S32K3 eMIOS输入捕获(ICU)技术,从信号测量到代码实现的完整流程。详细对比了六种核心捕获模式的性能差异,提供了动态模式切换、Counter Bus配置、中断服务程序优化等实战技巧,并分享了汽车电子中的典型应用案例,如发动机转速测量和CAN唤醒脉冲检测。

weixin_33137081的博客 347

IEC61850实战:从ICD文件解析到模型构建

本文深入解析IEC61850标准中的ICD文件结构,从Header、IED到DataTypeTemplates部分,详细介绍了如何构建电力自动化设备的数据模型。通过实战案例展示ICD文件的创建过程,并分享常见问题的调试技巧,帮助工程师快速掌握IEC61850建模方法,提升电力系统自动化项目的实施效率。

weixin_26841743的博客 496

用C++构建对半搜索递归算法

原理简介:对半搜索是一种二分搜索,设当前搜索的子表为 ,令m=(left+right)/2 ,这种二分搜索被称为对半搜索;对半搜索算法是将数据表划分成几乎相等大小的两个子表。 下面是对半算法的递归算法代码,其中x是待查元素,left、right是搜索范围,(m、left、right)是元素下标。 对半查找递归实现函数: int Bsearch(int& x, int left, i...

JiandaoStudio 1206

芒果YOLOv8改进16:检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

YOLOv8代码改进教程:即插即用|新颖轻量化非对称多级压缩LADH检测头🎈

包括YOLOv5、YOLOv7、YOLOv8等模型改进 5611

算法,二分查找

二分查找法,也称折半(对半)搜索算法,是一种在有序数组中查找某一特定元素的搜索算法适用前提条件1,存储在数组中2,有序排序搜索过程从数组的中间元素开始,如果中间元素是我们要找的元素,搜索过程结束如果某一特定元素大于或者小于中间元素,则在数组大于或小于那一半中查找,而且跟开始一样从中间开始比较如果在某一步数组为空,则代表找不到这种搜索算法每一次比较都使搜索范围缩小一半相比于普通的顺序查找法,差别如下图所示。

weixin_42738504的博客 707

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构之对半查找

这是我写的第二篇博客,本篇介绍如何利用Java编写对半查找的程序(其中可能有许多错漏之处,但大部分内容是可以接受的。见谅)。 顾名思义,对半查找就是从一列数据中间--也就是对半所划分的地方查找。对半查找适用于使用顺序存储的有序线性表。这里所说的“顺序存储”即是数据被写入内存中的一块连续的存储空间,而连续的这些内存空间是有其相应的编号即其内存地址来标志的,我们可以通过地址来访问这些数据。 而所谓的“有序”指的是数据的有序,例如:1,2,3,4,7,99,567,...,'a','b','h',...,这些

weixin_56870809的博客 2363

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

对半搜索递归实现 C++

把文字粘贴过来发现下标会乱掉,就存图了。 注意对半搜索要求数组有序,测试代码: #include #include using namespace std; int arr[6]; int Bsearch(int& x, int left, int right){ if(left <= right){ int m = (left + right)/2

Yesterday You Said Tomorrow. 1555

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

折半查找的迭代实现

/** * 2017年4月19日18:01:27 * ------------------------------------------------------ * 本程序的问题描述: * 折半查找算法的非递归实现 * ------------------------------------------------------ * 本程序的主要思路是: * data[]原始数

王二狗 912

对半检索算法+快速排序

#include<bits/stdc++.h> using namespace std; void Enter(int a[],int n) { for(int i = 0; i < n; i++) cin>>a[i]; return ; } void Display(int a[],int n) { for(int i = 0; i < n; i++) { cout<<a[i]<<(i =

qq_45687225的博客 329

有序线性表 | 对半搜索

对半搜索: 当表长是奇数:那就是中间元素作为分割点。 当表长是偶数:那就是中间两个元素的前一个作为分割点。 即(low + high) / 2 向下取整 #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; typedef int ElemType; ty...

JacobTsang的博客 1355

有序表的查找-折半查找

折半查找定义:先确定待查找记录所在范围,然后逐步缩小范围直到找到或找不到记录为止 low,high 分别为待查找范围的上界和下界,指针mid指示区域的中间位置,折半查找的范围其实就是用mid不断更新low或者high的位置,直到找到目标值,注意查找之前需要确保表是有序的 mid=(low+high)/2 设目标值为key;当key<mid时 则更新high=mid-1;此时范围为[lo...

qq_14991435的博客 4954

有序表的查找(折半查找)

有序表:对于以数组方式存储的数据,如果已经按其关键字值的大小顺序排列好,则称为有序数组或有序表。    对有序表可以采用折半查找(binary search),又称二分查找。   设有序数组r中每个记录的关键字值按升序排列为:       r0.key, r1.key, r2.key, …, rm.key, …, rn-1.key   其中,n为记录个数。当i<j时,有ri.ke

king110108的专栏 5637

7083 有序表折半查找算法

#include <iostream> #include<bits/stdc++.h> using namespace std; void search(int data[],int x,int len){ int low,high,mid,num=0,pos=-1; low=1;high=len; mid=(low+high)/2; while(low<=high){ if(data[mid]==x) {pos=mid;num++;break;} if(data[mid]&g

喝泉水的泉 480

有序表查找---折半查找算法

折半查找概念 折半查找,又称二分查找。 前提是线性表中的记录必须是关键码有序(由小到大或由大到小),线性表必须采用顺序存储。 折半查找的基本思想是:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间值的关键字,则在中间记录的右半区继续查找。重复上述过程,直到查找成功,或查找所有区域无记录,返回...

如是说的博客 2万+

有序表——折半查找

二分查找又称折半查找,前提要求数据序列呈现线性结构,即必须是经过排序的。 基本思路:       在一组有序序列中,取中间值与给定关键字进行比较,如果给定关键字大于该值关键字,则要查找的关键字位于有序序列的后半部分;若给定小于该值,则要查找的关键字位于有序序列的前半部分。每次将有序序列的长度缩小一半之后,再从中间位置的记录进行比较,依次反复进行。 查找过程如下: 1、查找初

LeoByte的编程驿站 4703

有序表的查找——折半查找分析

折半查找一、折半查找的查找过程1、折半查找(Binary Search)2、二分查找的基本思想二、折半查找的实现三、折半查找的性能分析四、总结 一、折半查找的查找过程 1、折半查找(Binary Search) 折半查找又称二分查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用数组向量作为表的存储结构,不能使用链表,不妨设有序表是递增有序的。 2、二分查找的基本思想 二分查找的基本思想是:(设R[low…high]是当前的查找区间) (1)首先确定该区间的中点

qq_43717119的博客 1万+
上一篇: ListSet_对半搜索的递归算法
下一篇: Codeforces Round #327 (Div. 2) 591ABC题解
GKHack
博客等级 码龄11年 48粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值