`
jgsj
  • 浏览: 1028306 次
文章分类
社区版块
存档分类
最新评论

搜索

 
阅读更多
题目堆栈搜索
存储结构:
物理存储结构:要查询的数据存放静态数组中。在查找时把对应元素的指针入栈出栈。
逻辑存储结构:采用静态数组的方法存储,在静态数组中的数据符合最大堆或最小堆的原则。
思想的形成:
在顺序搜索中需要逐次比较,其平均速度较慢;在折半搜索中虽速度较快,但要求数据按一定的顺序存放,对于无序的数据进行排序需要花费较多的时间。所以提出另外一种搜索方法:堆栈搜索(堆和栈配合使用)。因为对于无序的数据进行调整堆所花的时间相对较少。
在最小堆中任意一个子完全二叉树的跟元素为这子二叉树中最小的元素,所以我们可以根据查找元素与子二叉树的比较来判断是否要与这树中的其他元素继续比较。而且在建立最小堆所花费的时间不是很多(相对于把数组元素排序而言)。因为有可能与左孩子与右孩子相比较,所以我们要用栈来记录还需比较的元素。
算法思想:

堆栈搜索
定义一个堆的类和一个栈的类用来存放数组元素与元素的指针(下标)。
读入元素并建立最小堆。(如果要增加元素也要增加的时候同时建立最小堆)
进行搜索操作:数组为arr[],搜索元素为a;
Int i=0;进入循环(把最后一个元素设置为监视哨,用于判断循环结束)
A与arr[i]相比较;
相等 a小于arr[i] a大于arr[i]
如果i不等于当前元 出栈一元素继续比较。 先把其右孩子下标进栈
素加一返回找到元素 如果栈空,则返回 i=2i+1;继续比较
的下标否则返回-1; -1
查看搜索函数返回的值:
返回值为-1, 返回值为一其他整数
说明没有找到要找到的元素 输出找到元素的相应信息
搜索结束,把栈置空返回。
程序代码为:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<conio.h>
struct field {
char stu_num[6]; //比实际长度多1位
char name[7]; //比实际长度多1位
char sex[3]; //比实际长度多1位
intage;
//以考试成绩为排序关键码
};
template <class Type> class MinHeap;
//定义排序数据记录(一行数据的各列)
template <class Type> class Record {
friend class MinHeap<Type>;
private:
Type key; //排序关键码
field other; //其它数据列
public:
//提取排序关键码
Type getKey ( ) { return key; }
//修改排序关键码
void setKey ( const Type x ) { key = x; }
//重载判断运算符判this == x
bool operator == (Record<Type> x )
{ return key == x.key; }
//重载判断运算符 判this <= x
bool operator <= (Record<Type> x )
{ return key <= x.key; }
//重载判断运算符 判this < x
bool operator < (Record<Type> x )
{ return key < x.key; }
//重载判断运算符 判this > x
bool operator > (Record<Type> x )
{ return key > x.key; }
friend ifstream & operator >> ( ifstream & fin ,Record<Type>& x );
friend ostream & operator << ( ostream & fout ,Record<Type>& x );
};
//H0001潘刀郎 男 49 56.8
template <class Type>
ifstream & operator >> ( ifstream & fin ,Record<Type>& x )
{ fin>>x.other.stu_num;fin>>x.other.name;fin>>x.other.sex;
fin>>x.other.age;fin>>x.key;
return fin;
}
template <class Type>
ostream & operator << ( ostream & out ,Record<Type>& x ){
out<<x.other.stu_num<<"";out<<x.other.name<<"";out<<x.other.sex<<"";
out<<x.other.age<<"";out<<x.key<<"";
return out;
}
template <class Type> class headstracksearch;
//定义“最小堆”
template <class Type> class MinHeap{
friend class headstracksearch<Type>;
private:
Type * heap; //存放最小堆元素的数组
int CurrentSize;//堆当前元素个数
int HeapMaxSize; //堆元素个数上限
//私有成员函数:只能由公有成员函数调用
void FilterDown ( int i, int m );
//从 i 到m自顶向下进行调整成为最小堆
void FilterUp ( int i );
//从 i 到0自底向上进行调整成为最小堆
public:
MinHeap ();//无参构造函数
//构造函数:建立最小堆
MinHeap ( Type *, int , int );
~MinHeap ( ) ;
//删除堆顶元素
bool RemoveMin ( Type& x );
//向最小堆插入一个元素
bool Insert ( const Type x );
bool IsEmpty ( ) const;//判堆空否
bool display();
};
//构造函数:建立最小堆
template <class Type>
MinHeap <Type> ::MinHeap ( ):heap(NULL),CurrentSize(0),HeapMaxSize(0){
}
template <class Type>
MinHeap <Type> ::
MinHeap ( Type * p, int cur,int max )
{
HeapMaxSize = max;//
heap = p;
CurrentSize = cur;//当前堆大小
int currentPos = CurrentSize/2-1;
//找最初调整位置:最后的非叶子结点号
//从下到上逐步扩大,最后形成完整的堆
while ( currentPos >= 0 ) {
//对子树进行自顶向下调整,形成子堆。
FilterDown ( currentPos, CurrentSize-1 );
//从currentPos开始,到数组末尾止,调整
currentPos--;
}
}
//析构函数
template <class Type>
MinHeap <Type> ::~MinHeap ( ){
delete [] heap;
}
//对以序号start为根结点的子树进行
//自顶向下的调整,使其成为最小堆。
//参数EndOfHeap是子树里最后一个结点序号
template <class Type>
void MinHeap<Type> ::
FilterDown ( int start, int EndOfHeap )
{
int i = start;
int j = 2*i+1; // j 是 i 的左孩子
Type temp = heap[i]; //暂存子树的根
while ( j <= EndOfHeap ) { //调整完?
if ( j < EndOfHeap &&
heap[j] > heap[j+1] )j++;
//让j指向左右孩子中最小者
if ( temp <= heap[j] ) break;
//根结点不大于最小者,不调整
else { heap[i] = heap[j];//上浮调整
i = j; //向下滑动一层
j = 2*i+1; //j是i的左孩子
}
}
heap[i] = temp; //根结点归位
}
//判堆空否
template <class Type>
bool MinHeap <Type> :: IsEmpty ( ) const{
return CurrentSize==0;
}
//在堆中插入新元素 x
template <class Type>
bool MinHeap<Type> :: Insert ( const Type x )
{
if ( CurrentSize == HeapMaxSize ) { //堆满
cerr << "堆已满" << endl;
return false;
}
heap[CurrentSize] = x;//插在表尾
FilterUp (CurrentSize);//向上调整为堆
CurrentSize++; //堆元素增一
return true;
}
//从 start 开始,向上直到0,调整堆
template <class Type>
void MinHeap<Type> :: FilterUp ( int start )
{
int j = start,i = (j-1)/2;
// i 是 j 的双亲
Type temp = heap[j];//暂存起点元素
while ( j > 0 ) {//调整到栈顶
if ( heap[i] <= temp ) break;
//不用调了
else {//向上调整
heap[j] = heap[i];
j = i;i = (i -1)/2;
}
}
heap[j] = temp; //起点元素归位
}
template <class Type>
bool MinHeap <Type> :: display(){
for( int i=0; i<CurrentSize;i++)
cout<<heap[i]<<endl;
cout<<endl;
return true;
}
//栈
#define MAXSIZE 20
template<class Type>
class stack{//定义一个栈
protected:
int * p;//用数组的形式存放栈的元素
int imaxsize;//栈所能存放的最大元素个数
int itop;//栈中当前所存放的元素个数
public:
stack(int a=MAXSIZE);//缺省状况下的最大值为MAXSIZE
~stack();
bool push(Type &);//进栈
bool pop(Type &);//出栈
bool checkele(int a,Type & ele);//查看栈中与栈顶元素相距为a个的元素.元素返回在ele中
bool MakeEmpty();//置空栈
int IsEmpty();//判断是否为空
int IsFull();//判断是否为满
};
//构造函数
template<class Type>
stack<Type>::stack(int a)
{
imaxsize=a;itop=-1;
if(!(p=new Type[a]))
cerr<<"内存不足,不能运行此程序";
}
//析构函数
template<class Type>
stack<Type>::~stack(){
}
//进栈函数
template<class Type>
bool stack<Type>::push(Type &ele)
{
if(itop<imaxsize)
p[++itop]=ele;
else
return false;
return true;
}
//出栈函数
template<class Type>
bool stack<Type>::pop(Type &ele)
{
if(itop+1)//如果为空加一为零
ele=p[itop--];
else
return false ;
return true ;
}
//检查栈中数据的函数
template<class Type>
bool stack<Type>::checkele(int a,Type&ele)
{
if(itop-a>=0)
ele=p[itop-a];
else
return false ;
return true ;
}
//把栈置空函数
template<class Type>
bool stack<Type>::MakeEmpty()
{
if(itop+1)//已经为空
return false ;
itop=-1;
return true;
}
//判断栈是否为空函数
template<class Type>
int stack<Type>::IsEmpty()//判断是否为空
{
return itop+1;//如果为空则返回0
}
//判断栈是否为满函数
template<class Type>
int stack<Type>::IsFull()
{
return (itop+1)/imaxsize;
}
template<class Type>
class headstracksearch{
MinHeap<Type>*datalist; //最小堆的数组
stack <int>*Stack; //
bool isminheap;//是否为最小堆
public:
headstracksearch<Type>(Type * = NULL,int=10 , int=10);
~headstracksearch<Type>();
bool display();
int searchdata(Type & );
};
//构造函数
template<class Type>
headstracksearch<Type>::headstracksearch<Type>(Type * a,int b,int c)
:isminheap(true){
datalist = new MinHeap<Type>(a,b,c);
}
//析构函数
template<class Type>
headstracksearch<Type>::~headstracksearch<Type>(){
// deletedatalist;deleteStack;
}
template<class Type>
bool headstracksearch<Type>::display(){
datalist->display();
return true;
}
//查找函数
template<class Type>
int headstracksearch<Type>:: searchdata(Type & aa ){
if(!isminheap){
cout<<"数组中的数据不是按最小堆存放, 不能查找,按任意键退出"<<endl;
getch();
return -1;
}
Stack= new stack<int>(datalist->CurrentSize);
int i=0,a;
while(i<datalist->CurrentSize){
if(datalist->heap[i]==aa)
return i;
else if(datalist->heap[i]>aa){//出栈一元素继续比较,如果栈空,则返回-1
if(!Stack->pop(i))
return -1;
}
else{
a=2*i+2;
Stack->push(a);
i=2*i+1;
}
}
return -1;
}
//主函数
void main()
{
ifstream fin;
int a=15,i=0;
char filename[15]="wjh.txt";
Record<double> * p;
cout<<"请输入要建立最小堆数组的最大长度"<<endl;
// cin>>a;
p=new Record<double>[a+1];
// cout<<"请读入数据的文件"<<endl;
// cin>>filename;
fin.open(filename);
if( fin.fail() ){
cout<<"文件读取失败!!!"<<endl;
return ;
}
while(i<a&&!fin.eof() ){
fin>>p[i];
i++;
}
// datalist=new MinHeap<Type>;
headstracksearch< Record<double> >MINh(p,i,a+1);
MINh.display();
i=MINh.searchdata(p[2]);
if(i==-1){
while(a!=13){
cout<<"没有找到相应的数据,按回车键确定"<<endl;
a=getch();
}
return ;
}
cout<<"找到要找的数据: "<<p[i]<<endl;
}
分享到:
评论

相关推荐

    综合搜索引擎与垂直搜索引擎的比较研究

    综合搜索引擎与垂直搜索引擎作为互联网信息服务的两大主要工具,正日益成为人们检索和获取信息的重要途径。在本文中,我们将探讨两者在信息服务模式上的差异,以及它们之间的竞争与合作关系,并展望垂直搜索引擎未来...

    可切换搜索引擎的导航网页搜索框

    一个可切换搜索引擎的导航网页搜索框,为用户提供了一站式的便捷搜索体验,允许用户根据需求快速切换不同的搜索引擎,如百度、谷歌、搜狗等。这样的设计旨在满足不同用户对于搜索结果偏好和效率的需求。 首先,我们...

    discuz默认全文搜索,及只搜索主题帖子,过滤回帖的方法

    一,discuz默认为只搜索标题,可修改为默认搜索全文.二,discuz默认的全文搜索默认为搜索回复的内容及一楼的主题内容.这里可修改为只搜索主题.过滤回复帖子.三,论坛搜索框旁边的热搜,也修改为全文搜索---------四,注意...

    C# 自定义带搜索下拉框

    在C#编程中,自定义带搜索功能的下拉框是一种常见的需求,它能提供更加高效和便捷的用户交互体验。系统自带的下拉框(ComboBox)虽然简单易用,但在处理大量数据时,如果没有搜索功能,用户可能需要滚动浏览整个列表...

    文件光速搜索神器

    光速搜索是一款可以完全替代windows搜索的桌面快速搜索工具,是目前搜索和管理个人电脑文件最快的软件产品。光速搜索同样是基于NTFS文件系统的特性来实现它超“瞬间”的搜索效果的,因此你必须保证你的分区格式都是...

    PHP网盘资源搜索源码,网盘资源搜索系统

    其他说明:127盘搜网盘搜索神器,最快最稳定的网盘搜索神器,可支持所有网盘搜索,百度,360,微云,城通网盘,迅载网盘,百度网盘,千脑网盘,vdisk威盘,新浪微盘,119G网盘,千军万马,一木禾网盘,可无限添加您要搜索的网盘...

    爬虫搜索,简单的搜索引擎,java爬虫,搜索引擎例子,爬虫demo,java实现互联网内容抓取,搜索引擎大揭密

    在IT领域,爬虫搜索和搜索引擎是至关重要的技术,它们为获取、整理和提供网络上的海量信息提供了有效手段。本文将深入探讨这些概念,并通过一个简单的Java爬虫程序实例进行说明。 首先,让我们理解什么是爬虫。爬虫...

    超级网际搜索(SuperSearch) V5.3.11.42,内置147个搜索引擎

    免费、快速、高效的多引擎搜索工具,内置140多个国内外搜索引擎,并拥有详细的搜索分类。主要功能如下: * 一次关键字输入,多个引擎同时搜索,提高搜索效率,减少解决问题的时间 * 内置支持140多个搜索...

    禁忌搜索算法 ppt

    禁忌搜索算法ppt 禁忌搜索算法是一种智能优化方法,主要用于解决复杂优化问题。该算法的核心思想是通过禁忌搜索来避免局部最优解,从而寻找全局最优解。 局部搜索是禁忌搜索算法的基础,它是指在解空间中搜索邻域...

    OD中文搜索插件

    OD中文搜索插件是一款专为优化中文搜索体验而设计的工具,主要应用于OD(可能是某个软件或平台的缩写)环境中。它旨在提高用户在处理大量中文数据时的查找效率,提供更为精准和便捷的搜索服务。下面我们将深入探讨这...

    WPF自定义搜索控件

    本文将深入探讨如何构建一个自定义的搜索控件,这在各种应用程序中都十分常见,用于提供用户友好的搜索功能。我们将基于提供的资源——"SearchableTextBoxExample",来讲解这个自定义WPF搜索控件的设计与实现。 ...

    百度搜索框html代码

    3. 动态效果:例如,当鼠标悬停在搜索框上时,可以改变搜索框的外观,或者在用户输入时显示实时搜索建议。 最后,`css`目录包含样式表文件,这些文件定义了网页元素的样式。CSS可以用来控制搜索框的布局、颜色、...

    批量搜索大师 搜索多个文件 一键复制

    《批量搜索大师》V3.1是一款专为用户设计的高效能文件搜索工具,它集成了批量搜索和一键复制的功能,极大地提升了用户在处理大量文件时的工作效率。在这个数字化时代,我们经常需要处理大量的文件,查找特定的文档或...

    文件搜索软件 - 比Win7自带的搜索快多了

    在IT领域,文件搜索效率是提高生产力的关键因素之一。标题提到的“文件搜索软件 - 比Win7自带的搜索快多了”显然是一款专门优化文件查找速度的应用程序,旨在解决Windows 7操作系统中内置搜索功能的性能问题。描述中...

    可搜索加密方案设计

    可搜索加密方案设计 本文是一个关于云存储中可搜索加密方案的研究与设计的硕士研究生毕业论文。该论文的主要目的是设计和实现一个基于关键字索引的可搜索加密技术,以满足云存储服务器对加密数据的检索需求。 可...

    海康、大华、宇视摄像机搜索软件

    很多做安防的同事可以用到海康、大华、宇视的摄像机搜索工具。自己亲测都可以用。摄像机搜索软件通常用于寻找网络摄像机并对其进行配置和管理控制。摄像机搜索软件的发旧好处: 便捷性:使用摄像机搜索软件能够快速...

    走进搜索引擎.pdf

    《走进搜索引擎》是一本搜索引擎原理与技术的入门书籍,面向那些有志从事搜索引擎行业的青年学生、需要完整理解并优化搜索引擎的专业技术人员、搜索引擎的营销人员,以及网站的负责人等,是从事搜索引擎开发的工程...

    超级网际搜索(SuperSearch) - 3月30日最新版V5.1.28.94,内置140个搜索引擎

    免费、快速、高效的多引擎搜索工具,内置140多个国内外搜索引擎,并拥有详细的搜索分类。主要功能如下: * 一次关键字输入,多个引擎同时搜索,提高搜索效率,减少解决问题的时间 * 内置支持140多个搜索...

    asp.net源码搜索引擎.仿百度,后台包含爬虫.前台搜索页面

    【标题】"asp.net源码搜索引擎.仿百度,后台包含爬虫.前台搜索页面" 提供了一个基于ASP.NET技术的搜索引擎开发示例,这个项目旨在模仿百度搜索引擎的功能和界面,帮助开发者了解如何构建一个类似的搜索引擎系统。 ...

    百度搜索爬虫,爬取百度搜索结果

    一个小脚本而已,主要爬取...建议采用三个关键字搜索,保证搜索结果准确性 eg. geturl('北京 公司 首页', page=10) 爬虫结果自动导出为result.txt 格式:[url] [title] eg. http://www.baidu.com 百度一下,你就知道

Global site tag (gtag.js) - Google Analytics