`
hao3100590
  • 浏览: 128652 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

整数的随机置换

阅读更多

算法描述:生成前N个整数的随机置换,如{4,3,1,5,2},{4,5,3,2,1}是合法的,而{5,4,1,1,2}不合法,因为3没出现。

1.基本算法

该算法效率比较低,O(n*n*logn),主要就是随机的生成一个数,然后再一直数组中去检测是否存在,如果不存在才插入。从而效率低下

 

//使用的是思想1(O(n*n*logn))
int* getRandom(int* a, int length){
		for(int i=0; i<length; i++){
			int j = randInt(0, length);
			//循环,直到找到一个在数组中不存在的值,这里的复杂度是n*logn
			while(true){
				if(findExist(a, i, j)){
					j = randInt(0, length);
				}else{
					break;
				}
			}
			a[i] = j;
		}
		return a;
}

 2.对算法1进行了改进,主要就是增加了一个标志数组,对于已经使用过的数进行了标记,从而不用再遍历原数组,复杂度O(n*logn)降低了不少,但以空间换时间

 

//使用思想2(O(n*logn))
int* getRandom2(int* a, const int length){
		int used[LEN] = {0};
		for(int i=0; i<length; i++){
			int j = randInt(0, length);
			//循环,直到找到一个在数组中不存在的值
			while(used[j]){
				j = randInt(0, length);
			}
			used[j] = 1;
			a[i] = j;
		}
		return a;
}
 

 

3.使用了逆向思维,为什么我们不一次性插入所有数据,然后再随机交换位置,从而达到此效果呢?该算法就是这样,复杂度O(n),线性的

 

//使用思想3(O(n))
int* getRandom3(int* a, const int length){
		int i;
		//初始化0-9
		for(i=0; i<length; i++){
			a[i] = i;
		}
		//任意交换位置,打乱次序
		for(i=0; i<length; i++){
			int temp = a[i];
			int j = randInt(0, i);
			a[i] = a[j];
			a[j] = temp;
		}
		return a;
}

 

 从1-3就是一个算法改进的过程体现,不断的减少时间复杂度,空间消耗,从而实现一个优秀的算法所必须的过程。

 

4.全部代码

 

#include <iostream>
#include <cstdlib>
#include <time.h>//用于做种子
const int LEN = 1000;
using namespace std;

int randInt(int start, int end){
	return start+(end-start)*rand()/(RAND_MAX + 1.0);
}

int findExist(const int* a, int length, int value){
	for(int i=0; i<length; i++){
		if(a[i] == value) return true;
	}
	return false;
}

//使用的是思想1(O(n*n*logn))
int* getRandom(int* a, int length){
		for(int i=0; i<length; i++){
			int j = randInt(0, length);
			//循环,直到找到一个在数组中不存在的值,这里的复杂度是n*logn
			while(true){
				if(findExist(a, i, j)){
					j = randInt(0, length);
				}else{
					break;
				}
			}
			a[i] = j;
		}
		return a;
}


//使用思想2(O(n*logn))
int* getRandom2(int* a, const int length){
		int used[LEN] = {0};
		for(int i=0; i<length; i++){
			int j = randInt(0, length);
			//循环,直到找到一个在数组中不存在的值
			while(used[j]){
				j = randInt(0, length);
			}
			used[j] = 1;
			a[i] = j;
		}
		return a;
}

//使用思想3(O(n))
int* getRandom3(int* a, const int length){
		int i;
		//初始化0-9
		for(i=0; i<length; i++){
			a[i] = i;
		}
		//任意交换位置,打乱次序
		for(i=0; i<length; i++){
			int temp = a[i];
			int j = randInt(0, i);
			a[i] = a[j];
			a[j] = temp;
		}
		return a;
}


int main(){
//	srand(unsigned(time(0)));//,随机数种子,使用这个就可以每次不同
	int a[LEN] = {0};
	srand(time(NULL));
//	int *b = getRandom(a, LEN);
//	int *b = getRandom2(a, LEN);
	int *b = getRandom3(a, LEN);
	for(int i=0; i<LEN; i++){
		cout<<b[i]<<" ";
	}
	return 0;	
}
 

 

0
0
分享到:
评论

相关推荐

    基于Java实现的(GUI)页面置换算法模拟系统【100012888】

    产生随机序列功能:​ 随机生成 1-128 之间的整数,作为指令序列号,同时将随机生成的数字除以 10 取余作为该指令的页地址,随机数的生成以当前时钟做种子,保证每次生成的随机性。 算法运行功能:1、根据先进先出...

    randpermmat (N, M):随机排列矩阵-matlab开发

    randpermmat-随机置换矩阵A = randpermmat(N) 返回一个方阵,其中每一行和每一列保存整数 1:N 的排列。 这也称为随机拉丁广场,每个整数在每一行和每一行中恰好出现一次柱子。 A = randpermmat(N, M) 返回一个 N×M ...

    一种基于整数变换DC分量的自适应视频水印算法

    水印嵌入之前进行随机置换与LDPC编码增强了水印抗攻击能力。实验结果表明,该算法能够保证很好的视频质量,视频帧的PSNR值高于50dB,并实现了水印的盲提取。对于常见的视频攻击有较强的鲁棒性,特别是在多种格式压缩的...

    permutation-iterator-rs:用于迭代随机排列的Rust库

    这是如何遍历[0, max)范围内的整数的随机排列,即从0包含到max不包含。 每次运行此命令,您都会得到不同的排列。 use permutation_iterator :: Permutor; fn main () { let max = 10 ; let permutor = Permutor ...

    数学建模真题matlab编程 MATLAB数学建模工具箱

    % *randmix - 随机置换 % *chi2test - 分布拟合度卡方检验 % % 数学规划 % lp - 线性规划 % linprog - 线性规划(在MATLAB5.3使用) % fmin - 一元函数极值 % fminu - 多元函数极值拟牛顿法 % fmins - 多元函数极值...

    使用位对影子的语义安全的公钥加密方案

    推论明文解不唯一的概率几乎为零,分析了新密码方案针对从公钥中提取私钥并从密文中恢复明文的安全性,其假设是:整数分解问题,离散对数问题和低密度子集和问题可以得到有效解决,并证明使用随机填充和随机置换的新...

    Matlab数学建模工具箱

    % *randmix - 随机置换 % *chi2test - 分布拟合度卡方检验 % % 数学规划 % lp - 线性规划 % linprog - 线性规划(在MATLAB5.3使用) % fmin - 一元函数极值 % fminu - 多元函数极值拟牛顿法 % fmins - 多元函数极值...

    MATLAB数学建模工具箱

    % *randmix - 随机置换 % *chi2test - 分布拟合度卡方检验 % % 数学规划 % lp - 线性规划 % linprog - 线性规划(在MATLAB5.3使用) % fmin - 一元函数极值 % fminu - 多元函数极值拟牛顿法 % fmins - 多元函数极值...

    基于单键可调整块密码的长度保留加密

    我们提出了一种基于n位可调整块密码(SLDT)的单密钥长度倍增器,它是字符串长度为整数间隔[n,n + 1,...]的字符串的保留长度的密码。... 如果基础可调整块密码是SPRP,我们证明SLDT是强伪随机置换(SPRP)。

    des源代码(加解密的密钥生成)

    //初始置换表IP int IP_Table[64] = { 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7, 56,48,40,32,24,16,8,0, 58,50,42,34,26,18,10,2, 60,52,44...

    基于LDPC码的盲视频水印算法研究 (2009年)

    水印信息经随机置换与LDPC编码,对经过二次整数变换之后的直流分量进行修改实现水印的嵌入。为了兼顾水印的不可见性与鲁棒性的要求,根据水印长度和变换之后系数的大小自适应地选择嵌入水印的组及系数的改变强度。...

    C语言实战105例源码

    实例25 模拟LRU页面置换算法 79 实例26 大整数阶乘新思路 82 实例27 银行事件驱动模拟程序 84 实例28 模拟迷宫探路 87 实例29 实现高随机度随机序列 89 实例30 停车场管理系统 91 第3部分 文本屏幕与...

    c语言实战105例源码

    25 模拟LRU页面置换算法  26 大整数阶乘新思路  27 银行事件驱动模拟程序  28 模拟迷宫探路  29 实现高随机度随机序列  30 停车场管理系统 31 菜单实现 32 窗口制作  33 模拟屏幕保护程序 ...

    DES数据加密

    通过使用更多的“置换表”,并且按伪随机的方式使用每个表,这种改进的加密方法已经变的很难破译。比如,我们可以对所有的偶数位置的数据使用a表,对所有的奇数位置使用b表,即使黑客获得了明文和密文,他想破译这个...

    randperms:randperm 的一个修改版本,用户对返回值有更多的选择。-matlab开发

    描述: randperms(n) 是从 1 到 n 的整数的随机排列。 randperms(m,n) 当 m &gt; n 时,返回 randperm(m) 的第 n 个元素; 当 m &lt; n 时,返回整数的排列从 m 到 n。 randperms(m,n,idx) 返回置换整数的第 idx 个元素...

    基于三维混沌系统的通用数字图像加密与恢复算法

    最后,对改进后的序列进行排序以生成相应的下标序列,并据此对图像进行像素坐标置乱,同时将无符号整数序列依次与对应的像素值进行异或运算以实现像素值置换。针对恶意剪切/涂鸦攻击,同时提出一种基于邻域相邻像素特性...

    C语言实战105例 含105个源代码

    实例25 模拟LRU页面置换算法 79 实例26 大整数阶乘新思路 82 实例27 银行事件驱动模拟程序 84 实例28 模拟迷宫探路 87 实例29 实现高随机度随机序列 89 实例30 停车场管理系统 91 第3部分 文本屏幕与...

    《C语言实战105例》

    实例25 模拟LRU页面置换算法 79 实例26 大整数阶乘新思路 82 实例27 银行事件驱动模拟程序 84 实例28 模拟迷宫探路 87 实例29 实现高随机度随机序列 89 实例30 停车场管理系统 91 第3部分 文本屏幕与...

    C语言实战105例源码.rar

    实例25 模拟LRU页面置换算法 79 实例26 大整数阶乘新思路 82 实例27 银行事件驱动模拟程序 84 实例28 模拟迷宫探路 87 实例29 实现高随机度随机序列 89 实例30 停车场管理系统 91 第3部分 文本屏幕与...

Global site tag (gtag.js) - Google Analytics