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

搜索

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

堆栈搜索
定义一个堆的类和一个栈的类用来存放数组元素与元素的指针(下标)。
读入元素并建立最小堆。(如果要增加元素也要增加的时候同时建立最小堆)
进行搜索操作:数组为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默认的全文搜索默认为搜索回复的内容及一楼的主题内容.这里可修改为只搜索主题.过滤回复帖子.三,论坛搜索框旁边的热搜,也修改为全文搜索---------四,注意...

    文件光速搜索神器

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

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

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

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

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

    《搜索引擎营销实训》课程教学大纲.docx

    《搜索引擎营销实训》课程教学大纲.docx《搜索引擎营销实训》课程教学大纲.docx《搜索引擎营销实训》课程教学大纲.docx《搜索引擎营销实训》课程教学大纲.docx《搜索引擎营销实训》课程教学大纲.docx《搜索引擎营销...

    库搜索路径 库搜索路径

    库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径库搜索路径...

    万能网盘搜索工具.exe

    网盘搜索是互联网人必备技能,虽然可能存在下载病毒、需要解压密码等情况,但瑕不掩瑜,很多资源用网盘搜索找起来还是非常快的 瞬间搜索  软件的搜索速度可谓是风驰电掣的秒搜速度,你只要输入你要搜索的内容,点击...

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

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

    ILSpy搜索功能加强版

    1.修改搜索功能,增加如下的额外搜索选项  A.按文本搜索(默认选项)  B.按通配符搜索  C.按正则表达式搜索 2.搜索增加如下特性:  A.可以按照名字空间检索特定名字空间下的所有类.  B.修正了官方版本无法...

    ECSHOP模糊分词搜索和商品列表关键字飘红功能

    最近在用ECSHOP做一个商城,发现ECSHOP的模糊搜索要求太高,需要加入and、空格、加号等,客户搜索的时候不可能这样操作。所以想对搜索功能进行改进,可是在网上没有找到这样的插件,有收费的,结果要2000大元。考虑...

    Outlook专业搜索工具Lookeen

    软件类型: 办公软件,邮件搜索 运行环境:Windows 软件语言:英语,德语 授权方式:共享软件 软件大小:8.5MB 软件作者:Axonic 软件简介: Lookeen是微软Outlook插件,嵌入Outlook程序中帮助检索Outlook中的所有...

    通过百度搜索引擎提取关键词网址

    本软件用于从搜索引擎或者具体网页上提取链接,主要用途是搜索留言本、论坛、blog等地址 通过您设定的关键词 软件自动在搜索引擎结果里提取符合条件的连接 本软件把超链接分为两部分看待:连接和连接名称 通过...

    C语言实现:八数码问题的深度优先搜索、广度优先搜索、过程表示(全)

    由于每次将可能的新状态入栈,并标记为已经搜索到,当一直深入时便会遇到下一步可能搜索到的所有状态都已经标记为搜索过了,即没有可入栈的,这条深度搜索路线结束,下次出栈为栈顶状态,即另一条深度搜索路线。...

    章鱼搜索 搜索引擎

    章鱼搜索从BT网络里收录了互联网中海量的电影,音乐,游戏,书籍等资源,允许用户对资源进行预览和试看,是史上最强的资源搜索引擎工具,没有之一。

    站内全文搜索php源代码

    1)无需mysql支持,无需建立索引,无需设置路径,放在哪级目录下,就搜索该目录和子目录;可以搜索一切文本类型的文件(txt.htm.asp.php.cgi.chm.hlp.)search.php为简单版,如果站点文件数量大,占用空间多,推荐...

    百度自动搜索关键词,模仿人工浏览网页v2.01

    功能说明: 1.无限制设置关键词,可以不同关键词对应不同的站点 ...6.因为是免费软件,所以搜索关键词里内置了4个关键词,搜索完4个后才会搜索你设置的关键词 版本说明: 更新了部分电脑无法查看界面的BUG

    引力搜索算法(GSA)源代码+原理+详细注释

    引力搜索算法将所有粒子当作有质量的物体,能够作无阻力运动。每个粒子会受到解空间中其它粒子的万有引力的影响,并产生加速度向质量更大的粒子运动。由于粒子的质量与粒子的适度值相关,适度值大的粒子其质量也会更...

    免费邮件搜索软件_艺泰邮件搜索专家

    艺泰邮件搜索专家,绝对免费实用。按关键词搜索邮件,网络营销的好工具。 sn:111111111111111111111 高速邮件搜索软件 采用VC开发,非常稳定,具有: 1,互联网指定网址搜索,关键字搜索,同时可指定仅为中文网站...

    搜索引擎聚合源码搜索引擎聚合源码

    搜索引擎聚合源码

Global site tag (gtag.js) - Google Analytics