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连接。