ListSet_对半搜索的迭代算法
来源:互联网 发布:sql数据库完全备份 编辑:程序博客网 时间:2024/06/05 06:15
递归函数效率低, 常使用相应的迭代算法.
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, 否则返回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{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;}
1 0
- ListSet_对半搜索的迭代算法
- ListSet_对半搜索的递归算法
- 折半(对半)搜索算法
- ListSet_无序表搜索
- ListSet_有序表搜索
- 二分法搜索迭代和递归算法
- 迭代加深ID-DFS搜索算法
- 对半查找算法
- 图搜索算法(深度优先搜索、迭代加深的深度优先搜索、广度优先搜索、代价一致搜索、A*搜索)
- 对半搜索递归实现 C++
- 二进制树型搜索算法选择电子标签的迭代过程
- RFID8-5说明二进制树型搜索算法选择电子标签的迭代过程
- 迭代深度的深度优先搜索
- 迭代算法的收敛性
- 深度优先,广度优先和迭代加深搜索算法
- 埃及分数问题-迭代加深搜索与IDA*算法
- 算法竞赛入门第七章:迭代加深搜索
- hdu1667-IDA*-迭代加深搜索 A*算法
- Matlab坐标修改 gca
- monkeyrunner自动化测试工具--真机运行提示:could not connect to view server
- HDU 5533 Dancing Stars on Me(凸包)
- Servlet中的过滤器Filter详解
- 统计模式识别的原理与方法
- ListSet_对半搜索的迭代算法
- Eclipse \tmp0\work\Catalina\localhost\_\SESSIONS.ser (系统找不到指定的路径。)
- 涨姿势!关于可访问性设计师必知的7件事情(下)
- <iOS>iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- 模板_树状数组(BIT)
- 冬天里的外套
- 数据仓库基础概念
- Android开发遇到的坑(1):Java中List的安全删除问题
- Codevs P1157 2k进制数 2006年NOIP全国联赛提高组