算法设计与分析(一)——随机生成元素不重复序列

前言:

因为在一棵树中,每个结点的关键字要求各不相同,因此与之前报告不同,我们要改进我们的随机数生成算法来生成互不相同的元素。但在实验运行中,发现初始生成随机数组的方法速度非常慢,测试出运行时间,甚至比红黑树构建算法要慢得多,于是尝试改进生成方法。算法很简单,但是不同算法之间的性能差异明显。

话不多说,先上实验结果:
在这里插入图片描述

在这里插入图片描述

方法一,集合查重法(初始算法)。

这是最直接想到的方法,因为我们知道集合有很好的查找特性,用它来保存已经生成过的元素数值。每次随机生成元素后,用count()方法判断是否已经有该元素的出现,若数量不为0,则继续随机生成,直到检测到某元素值在集合中的数量为0,那么循环结束,将新生成的元素插入集合中。

在这里插入图片描述

方法二,数组标记法。

我们开一个空数组专门用来记录给定范围内的某数值是否已经生成,初始化为0,如果生成过则标为1,每次生成随机数检查对应位置,确保同一数值不重复出现。根据实验测试结果,我们发现运行时间有了大幅度的提升,在数据规模为1e2、1e3、1e5的时候甚至上升了两个数量级,数据量为1e5时,结果尤为显著。其余情况也都分别上升了1个数量级。
但相比之前方法,我们在开始就给出了定长数组,消耗了更多的空间。于是继续尝试改进方法,在确保运行时间的同时,节省一定空间。

在这里插入图片描述

方法三,随机交换法。

首先按序生成数组值,再随机生成两个数组下标进行交换以打乱顺序,循环N次以保证数组足够随机。根据实验测试结果,意外发现该算法设计出发点是为了节省空间,但是当数量规模达到1e4及以上,运行时间又提升了一个数量级。
此方法有个局限是给出的范围必须是紧确的,但完全能够满足本实验的要求。至此,改进算法结束。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值