编程珠玑: 13章 搜索 13.4使用整数结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
来源:互联网 发布:广州海关数据分中心 编辑:程序博客网 时间:2024/04/29 12:44
#include <iostream>#include <stdio.h>using namespace std;/*问题:使用箱子和链表,生成[0 ,maxval]范围内m各随机整数的有序序列分析:采用比如4个相似,将元素划分到每个箱子中,每个箱子内部用链表表示。等同于是对链表的优化输入: 100(元素最大值) 10(输出的元素个数) 输出; 输出10个0~100且有序的元素 关键:1 采用比如4个相似,将元素划分到每个箱子中,每个箱子内部用链表表示。等同于是对链表的优化2 插入元素:首先计算元素应该在哪个箱子中:这里让数据除以箱子的个数取余来确定分配的箱子,这样无法确保后面打印时候有序箱子编号 = 插入值* 箱子个数 / 最大值,这样会导致溢出,上下同除一箱子个数,为防止除数为0,箱子个数加1,: 箱子编号 = 插入值 / (1 + 最大值 / 箱子个数)*/typedef struct Node{Node():_next(NULL){}Node* _next;int _value;}Node;int randRange(int min ,int max) { if(min > max) { int temp = min; min = max; max = min; } return ( rand() % (max - min + 1) + min ); } const int BIN_NUM = 4;template<class T>class SetIntBins{public:SetIntBins(int maxVal){_maxVal = maxVal;_binNum = BIN_NUM;_n = 0;_bins = new Node*[_binNum];//需要为每个箱子设置头结点,for(int i = 0 ; i < _binNum ; i++){_bins[i] = new Node();_bins[i]->_value = maxVal;}}void deleteList(Node* head){while(head){Node* nextNode = head->_next;delete head;head = nextNode;}}~SetIntBins(){//删除所有箱子for(int i = 0 ; i < _binNum ; i++){deleteList(_bins[i]);}delete _bins;}/*插入元素:首先计算元素应该在哪个箱子中:这里让数据除以箱子的个数取余来确定分配的箱子,这样无法确保后面打印时候有序箱子编号 = 插入值* 箱子个数 / 最大值,这样会导致溢出,上下同除一箱子个数,为防止除数为0,箱子个数加1,: 箱子编号 = 插入值 / (1 + 最大值 / 箱子个数)*/void insert(T value){//int binIndex = value % _binNum; // int binIndex = value / ( 1 + _maxVal / _binNum);//然后插入到对应箱子的链表中Node* head = _bins[binIndex];//如果箱子首结点的下一个结点为空,说明是第一次插入需要直接插入if(!head->_next){Node* newNode = new Node();newNode->_value = value;head->_next = newNode;_n++;}else{insertNode(value , head->_next , head);}}void insertNode(T value , Node* node , Node* previousNode){//如果没满,先寻找插入的位置(必须确保不重复),然后修改指针指向while(node){if(node->_value < value){previousNode = node;node = node->_next;}//重复,不插入,直接返回else if(node->_value == value){return;}//这里说明找到了不重复的元素,插入else{Node* newNode = new Node();newNode->_value = value;previousNode->_next = newNode;newNode->_next = node;_n++;return;}}//走到这里说明:待插入的元素恰好是在链表尾部,需要插入Node* newNode = new Node();newNode->_value = value;previousNode->_next = newNode;_n++;}int size(){return _n;}//如果是按照除以箱子个数取余,那么最后输出结果的时候,无法知道顺序。只能用比如0~99:分配第一个箱子存放0~24这种void report(int* v){if(NULL == v){return;}int j = 0;for(int i = 0 ; i < _binNum ; i++){Node* head = _bins[i]->_next;while(head){v[j++] = head->_value;head = head->_next;}}}public:int _binNum;Node** _bins;//若干个箱子,每个箱子中存放的是结点指针int _maxVal;int _n;};void print(int* v , int size){if(NULL == v || size <= 0){cout << "No result" << endl;}else{for(int i = 0 ; i < size; i++){cout << v[i] << " ";}cout << endl;}}void process(){int maxVal;int maxSize;while(cin >> maxVal >> maxSize){int* array = new int[maxSize + 1];SetIntBins<int> intSetBins(maxVal);while(intSetBins.size() < maxSize){int value = randRange(0 , maxVal);intSetBins.insert(value);}intSetBins.report(array);print(array , maxSize);delete[] array;}}int main(int argc , char* argv[]){process();getchar();return 0;}
0 0
- 编程珠玑: 13章 搜索 13.4使用整数结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- 编程珠玑: 13章 搜索 13.1生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- 编程珠玑: 13章 搜索 13.2使用线性结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- 编程珠玑: 13章 搜索 13.2使用链表结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复-------解题总结
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 优化解法-------解题总结
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 -------解题总结
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 解法2-------解题总结
- 编程珠玑---读书笔记---生成随机整数的有序子集
- 编程珠玑_第十三章_生成一个随机整数的有序集合
- 编程珠玑 ~~ 排序与随机整数序列
- 编程珠玑第十二章 生成有序随机序列
- 生成某个范围内的随机整数公式
- js生成指定范围内的随机整数
- 生成指定范围内的整数序列
- java 随机生成18到25范围内的整数
- [转]mysql 随机函数生成某个范围内的整数
- mysql 随机函数生成某个范围内的整数
- 网络编程——URL读取网页数据
- 实验
- 神经网络深入(连载1)神经网络的拓扑
- Leetcode 9. Palindrome Number
- 数学预习题目分析
- 编程珠玑: 13章 搜索 13.4使用整数结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- Axis2与Spring集成发布
- eclipse_快捷键
- Git 使用规范流程
- javascript常用语句,如表单禁止复制,剪切等
- 数据分析分类
- linux设置静态ip
- Leetcode 5. Longest Palindromic Substring
- IL指令汇总