求高效的C/C++打散函数。

Balancer 2015-01-30 10:23:35
描述:有一个数组,数组里有1000万个数据,这些数据的取值一共有六种。
问题:如果构建一个函数,将数组内的数据比较均匀的分布。
例如:
函数输入:[a,a,a,b,c,c,c,g,f,d]
函数输出:[a,g,c,a,f,a,c,d,a,c]
备注:因为数据量特别大,希望函数的最坏情况时间复杂度尽可能的高效。

谢谢。
...全文
472 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjgdftxmu 2015-03-08
  • 打赏
  • 举报
回复
可以参考一下洗牌算法
斩不断的风 2015-02-22
  • 打赏
  • 举报
回复
random shuffle
yfk 2015-02-10
  • 打赏
  • 举报
回复
考虑用交换的思路去做 java 代码: public class Test { public void ArrayRandom(ArrayList<Integer> array){ for(int i = array.size()-1; i>=0; i--){ int iRandom = (int)(Math.random()*i); //交换 Integer tmp = array.get(iRandom); array.set(iRandom, array.get(i)); array.set(i, tmp); } } public static void main(String args[]) { ArrayList array = new ArrayList<Integer>(); array.add(1); array.add(1); array.add(2); array.add(2); array.add(2); array.add(2); array.add(3); array.add(4); System.out.println(array); Test test = new Test(); test.ArrayRandom(array); System.out.println(array); } }
kerbcurb 2015-02-06
  • 打赏
  • 举报
回复
为了防止整形数组内容重复,你也可以采取上述方法生成那个整形数组,具体是根据有无被生成过作一判断
kerbcurb 2015-02-06
  • 打赏
  • 举报
回复
随机生成一个整形数组,整形数组里面存你的数据的下标,然后按整形数组下标顺序访问你的数据 long intarray[10000000]; type your_data[10000000]; random(intarray);//伪代码 for (i = 0; i< M;i++) { .......=your_data[intarray[i]]; }
dianyancao 2015-02-01
  • 打赏
  • 举报
回复
对这6个元素按其hash计数,得到每个元素x出现的次数p(x) 之后设计一个等概率分布的随机数发生器来产生x,当生成的x的个数等于p(x)时,不再产生x 这样不用存储输出,只需一个随机数发生器及其配置数据即可得到比较均匀的分布数据
就想叫yoko 2015-02-01
  • 打赏
  • 举报
回复
怎么3a变4a了

33,013

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧