Algorithm 按域均匀排列邮件地址列表

Algorithm 按域均匀排列邮件地址列表,algorithm,language-agnostic,Algorithm,Language Agnostic,我有一个电子邮件地址列表,我想按域平均分配 例如: 让我们来列举一下 a@a.com b@a.com c@a.com a@b.com b@b.com c@c.com 输出应该是 a@a.com a@b.com c@c.com b@a.com b@b.com c@a.com 源列表不像示例中那样按域排序,但可以按域排序,如果这样有帮助的话。这样做的有效(单/双过程?)算法是什么 raj我的初始尝试是链表的哈希映射,这样一旦所有域冲突都分组,您就可以一次迭代一个链表 如果这有意义的话 下面的代码

我有一个电子邮件地址列表,我想按域平均分配

例如:

让我们来列举一下

a@a.com
b@a.com
c@a.com
a@b.com
b@b.com
c@c.com
输出应该是

a@a.com
a@b.com
c@c.com
b@a.com
b@b.com
c@a.com
源列表不像示例中那样按域排序,但可以按域排序,如果这样有帮助的话。这样做的有效(单/双过程?)算法是什么


raj

我的初始尝试是链表的哈希映射,这样一旦所有域冲突都分组,您就可以一次迭代一个链表

如果这有意义的话

下面的代码完全未经测试,我知道在第二个循环中有很多东西不正确,但它比试图进一步解释要快

$sortedList = array();
$tempList
$emailList = array('a@a.com', 'b@a.com', 'c@b.com', 'd@b.com', 'e@c.com', 'f@a.com');

$emailCount = 0;
foreach ( $emailList as $email ) {
    list($username, $domain) = explode('@', $email);
    $tempList[$domain][] = $user;
    $emailCount++;
}

for ( $i = 0; $i < $emailCount; $i++ ) {
    $listIndex = $i % count($tempList);
    if ( !empty($tempList[$listIndex]) ) {
        $sortedList[] = $tempList[$listIndex][0];
        unset($tempList[$listIndex][0]);
    } else {
        unset$tempList[$listIndex]);
    }
}
$sortedList=array();
$tempList
$emailList=数组('a@a.com', 'b@a.com', 'c@b.com', 'd@b.com', 'e@c.com', 'f@a.com');
$emailCount=0;
foreach($emailList作为$email){
列表($username,$domain)=分解('@',$email);
$templast[$domain][]=$user;
$emailCount++;
}
对于($i=0;$i<$emailCount;$i++){
$listIndex=$i%计数($tempList);
如果(!empty($tempList[$listIndex])){
$sortedList[]=$tempList[$listIndex][0];
未设置($tempList[$listIndex][0]);
}否则{
取消设置$tempList[$listIndex]);
}
}

基本上,对于每个电子邮件地址,将地址放入给定域的链接列表中。这是一个O(n)操作,然后通过在域列表中循环创建一个新的平衡列表是另一个O(n)操作


按照顺序,这大约是2遍复杂度。

注意假设每个域的电子邮件地址数相同(或类似)的答案

我试图解决本质上相同的问题,在我的博客上收到了很多讨论:

我们没有找到一个快速、最佳的解决方案,但是(包括Perl源代码)来自于的一条评论


感谢亚里士多德。

这是我对这个问题的解决方案。给定一个输入,如

[["A", 13], ["B", 5], ["C", 3], ["D", 1]] 
输出是

AABABAACABAACABAACABAD
该程序的Ruby源代码为:

require "pp"

def shuffle (total, num)
  ret_arr = Array.new
  intervel = total/num.to_f
  0.upto(num-1) do |i|
    val = i * intervel
    ret_arr << val.floor
  end
  return ret_arr
end

freq_table = [["A", 13], ["B", 5], ["C", 3], ["D", 1]]

pp freq_table
total = 0
freq_table.collect {|i| total += i[1] }
final_array = Array.new(total,0)
print  final_array.to_s + "\n\n"
placed = 0

freq_table.each do |i|
  placements =  shuffle(total - placed, i[1])
  placements.each do |j|
    free_index = -1
    0.upto final_array.size do |k|
      free_index += 1 if (final_array[k] == 0 || final_array[k] == i[0])
      if j == free_index
        final_array[k] = i[0]
        break
      end
    end
  end
  print "Placing #{i[1]} #{i[0]}s over #{total - placed} positions\n"
  pp placements
  print  final_array.to_s + "\n\n"
  placed += i[1]
end
需要“pp”
def随机播放(总数,num)
ret_arr=Array.new
intervel=总计/数量到
0.最多(num-1)do|i|
val=i*intervel
好的,我可以问你为什么要洗牌吗?如果要将电子邮件流量平均分配到每个域,那么就不要这样做。让同一个域的邮件同时传递会更高效,因为它们可以共享SMTP连接。