ListSet_有序表搜索
来源:互联网 发布:javascript面试 编辑:程序博客网 时间:2024/06/05 15:10
一个有序表可以看成是一个已按关键字排序的有序集.
表的最后添增设了一个被称作哨兵的元素, 关键字为INF. 若表长为n, 需要在l[n]位置存放哨兵元素. 增加哨兵元素以后, 在for循环中不再
需要通过下标来判定是否已经查完整个表. 当表中l[i]的关键字值大于等于指定元素x的关键字时, for循环结束.
搜索失败的平均搜索长度: n / 2 + 2.
实现代码:
#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, 否则返回NotPresentvirtual ResultCode Insert(T &x) = 0; // 表中搜索与x关键字相同的元素, 若存在该元素, 赋值给x返回Duplicate, 若表已满返回Overflow, 若表未满返回Successvirtual ResultCode Remove(T &x) = 0; // 表中搜索与x关键字相同的元素, 若存在该元素, 赋值给x返回Success, 否则返回NotPresentvirtual bool IsEmpty() const = 0; // 集合为空返回truevirtual 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{for(int i = 0; l[i] <= x; ++i)if(l[i] == x) {x = l[i];return Success;}return NotPresent;}int main(int argc, char const *argv[]){ListSet<int> ls(20);int x = 11; ls.Insert(x);x = 22; ls.Insert(x);x = 33; ls.Insert(x);x = 44; ls.Insert(x);x = 88; ls.Insert(x);x = 100; ls.Insert(x);ls.Print();x = 88;if(ls.Search(x) == Success) cout << "Found " << x << endl;else cout << "Not Found " << x << endl;return 0;}
1 0
- ListSet_有序表搜索
- ListSet_无序表搜索
- ListSet_对半搜索的递归算法
- ListSet_对半搜索的迭代算法
- 基于有序顺序表的折半搜索
- Leetcode021--搜索有序链表的范围
- 有序数组搜索二分法
- 对有序表的查找(快步搜索算法)
- 搜索二叉树转为有序双向链表
- 二叉搜索树转换为有序双向链表
- 二叉搜索树转换为有序双向链表
- 二叉搜索树转换为有序双向链表
- 从二叉搜索树创建双向有序链表
- 有序单向链表转换为平衡搜索二叉树
- 二叉搜索树转换为有序双向链表
- 二叉搜索树 转 有序双向链表
- 二叉搜索树转化为有序双向链表
- 二叉搜索树转换成有序双向链表
- Mathematica 函数右下标有无的区别
- [HotSpot VM] JVM调优的"标准参数"的各种陷阱
- c++11特性之std::thread--进阶二
- java入门程序100例学习笔记(005递归调用)
- Facebook Android客户端热更新
- ListSet_有序表搜索
- 纹理贴图原理总结
- 第7讲项目1----------正差值
- 【D3.js数据可视化实战】--(3)桑基图(sankey)的绘制
- Lucene之——获取索引关键字给Jquery自动填充框架使用
- Js插件ECharts,HighCharts学习网址整理
- linux 下MySQL主从复制
- 使用HttpUrlConnection上传文件
- 《30天自制操作系统》学习笔记