昨天在wiki上看到的线性时间复杂度的算法,把他用代码实现出来了
函数里的shuffle_func2
具体参见这里http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
以下代码帖到你的编译器里,可以看到两种算法明显的效率之差了。
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int *a=0;
bool * fetch_flag=0;
vector<int>result_set;
void init_arr()
{
delete[]a;
delete[]fetch_flag;
a = new int[100000];
fetch_flag = new bool[100000];
result_set.clear();
for(int i=0; i<100000; i++)
{
a[i]=i+1;
fetch_flag[i]=false;
}
}
void shuffle_func1()
{
int pos,counter,real_pos;
srand(time(NULL));
for(int i=100000; i>0; i--)
{
pos = rand()%i+1;
//cout<<pos<<endl;
counter=0;
for(int j=0; j<100000,counter!=pos; j++)
{
if(fetch_flag[j]==false){
counter++;
}
real_pos=j;
}
result_set.push_back(a[real_pos]);
fetch_flag[real_pos]=true;
}
}
void shuffle_func2()
{
srand(time(NULL));
for(int i=100000;i>0;i--){
int pos = rand()%i;
result_set.push_back(a[pos]);
swap(a[pos],a[i-1]);
}
}
int main()
{
init_arr();
clock_t t_start = clock();
shuffle_func1();
clock_t t_end = clock();
cout<<"time 1"<<t_end-t_start<<endl;
init_arr();
t_start = clock();
shuffle_func2();
t_end = clock();
cout<<"time 2"<<t_end-t_start<<endl;
return 0;
}
分享到:
相关推荐
《完美洗牌问题》 在计算机科学中,完美洗牌是指对一个序列进行操作,使得序列中的每个元素在洗牌后都有...通过学习这些论文,我们可以掌握如何设计和实现高效、公正的完美洗牌算法,从而在实际问题中得到广泛应用。
2. 随机洗牌预处理:将数组元素洗牌,重新排序,以便选择基准元素。 实验结果: 通过实验,我们可以看出 Sherwood 型线性时间选择算法的实现可以达到选择数组中的中值的目的,并且可以在不同的输入规模下保持良好...
洗牌算法的一种常见实现是Fisher-Yates(或Knuth)洗牌算法,它在线性时间内完成,并且保证了均匀性。基本步骤如下: 1. 遍历数组,从最后一个元素开始。 2. 对于每个元素,生成一个随机索引,范围从当前元素的位置...
实验结果表明,无论输入序列的大小如何,舍伍德型线性时间选择算法都能有效地找到中值,并且两种实现方法(随机划分基准和随机洗牌预处理)在功能上等价,都能在平均情况下提高算法效率。 总之,舍伍德型线性时间...
舍伍德算法 线性时间选择随机化 洗牌预处理 文件为PPT
6. **随机预处理**:在某些情况下,确定性算法不能直接转化为舍伍德算法,这时可以通过对输入数据进行随机化预处理,如随机洗牌,来达到类似效果。这不会改变原有算法的本质,但可以提高整体效率。 总的来说,概率...
实现随机选择通常使用Fisher-Yates(也称为Knuth)洗牌算法,该算法在原数组上进行操作,保证每个元素被选中的概率相等。同样,由于数据直接来自后台,我们无需手动输入,从而提高了效率和准确性。 最后,随机采样...
发牌过程可能涉及到对这个数组进行洗牌的操作,这通常通过Fisher-Yates(或Knuth)洗牌算法来实现。这个算法是一种在线性时间内完成的原地洗牌方法,即不需要额外的存储空间。算法的基本思想是从最后一个元素开始,...
第7章 复杂的数值计算算法 206 7.1 拉格朗日插值 206 7.1.1 拉格朗日插值算法 206 7.1.2 拉格朗日插值示例 207 7.2 数值积分 210 7.2.1 数值积分算法 210 7.2.2 数值积分示例 211 7.3 开平方 213 7.3.1 开...
他们提供了一个线性时间复杂度的算法,可以在原地完成入堆洗牌操作,假设列表是以数组形式表示的,索引范围为 1 至 \(2n\)。 #### 新算法的特点 本文提出的新算法相比之前的方案更为简单,易于实现。新算法的关键...
对于二进制编码,工具箱支持单点交叉、两点交叉、多点交叉和洗牌交叉;对于实值编码,则提供了离散重组、中间重组、线性重组和具有突变特性的线性重组等多种交叉方式。 ##### 2.5 变异算子 变异操作可以增加种群的...
一种常见的方法是Fisher-Yates(也称为Knuth)洗牌算法,该算法在线性时间内完成,并确保了每一种排列的等概率出现。其基本思想是从最后一张牌开始,随机选择一张与其交换位置,然后向前遍历,直到第一张牌。这样,...
10. **模拟与随机化算法**:书中可能包含一些需要模拟过程的算法,如模拟投骰子、洗牌等,以及基于概率的随机化算法,如蒙特卡洛方法。 11. **C++编程基础**:除了算法本身,书中还会涉及C++编程语言的基本语法、...
如原始数据集并未划分训练集与测试集,建议在此前进行数据集的划分工作,代码如下: import pandas as pd from sklearn.model_selection import train_test_split # 读取CSV文件 data = pd.read_csv('数据清洗后....
当随机预处理技术应用于确定性算法,例如对输入数据进行随机洗牌,可以达到类似舍伍德算法的效果,例如在快速排序和线性时间选择算法中。 这些例子展示了概率算法在不同领域的应用,包括几何概率、数值计算和优化...
6. **随机预处理**:在某些情况下,如果无法直接将确定性算法转化为舍伍德算法,可以通过预先随机化输入数据,如随机洗牌,来达到类似效果,这种方法对于选择算法和排序算法尤其有效。 理解这些算法设计和分析的...
洗牌算法通常是通过Fisher-Yates(Knuth)洗牌算法实现,确保随机性。 3. **事件处理**:玩家的点击事件需要被正确捕获并处理。例如,当玩家点击开始按钮时,触发洗牌和抽牌操作;点击输入框提交答案后,判断点数...
20. **洗扑克牌(Shuffle)**:通常使用Fisher-Yates洗牌算法,实现随机排列。 21. **Craps赌博游戏**:涉及概率计算和随机数生成。 22. **约瑟夫问题(Josephus Problem)**:循环杀死序列中的特定位置,通常使用循环...
Fisher-Yates洗牌算法(Fisher-Yates Shuffle) 高斯复活节计算(Gauss Easter) 格雷厄姆扫描算法(Graham Scan) 贪婪算法(Greedy) 猜数字搜索(Guess The Number Search) H指数(H Index) 最近最少使用...