算法方面不是我的强项,所以遇到这个问题,记录一下解决方法;
最开始的时候,做法是从random中来随机选取一个,然后再判断已有列表中是否存在,
然后以此重复,看到这里,会算法的同学肯定会说这明显不行;就好比多少人中生日为一天的概率大于50%;
所以然后查找了一些资料,看到了洗牌算法;包括多种变种吧。
这里说一下我参考的解决办法;
比如有30万个元素的列表,那么第一次随机选择一个;记录位置是x;
然后把元素的最后一个位置元素存入位置x,然后把最后位置的元素删除;
(这里在交换的时候,需要判断这个元素原本是不是最后一个元素);
然后再在剩下的元素中随机选择一个,这样就不会重复了;
交换最后一个元素,可以减少列表整体偏移带来的性能影响;
大家可以试试;
时间: 2024-10-16 22:31:36