来源:谷歌面试问题
编写一个例程,以确保输入中的相同元素在输出中的分布最大?
基本上,我们需要以这样一种方式放置相同的元素,使总传播尽可能最大化。
示例:
Input: {1,1,2,3,2,3}
Possible Output: {1,2,3,1,2,3}
Total dispersion = Difference between position of 1's + 2's + 3's = 4-1 + 5-2 + 6-3 = 9 .
我一点也不确定,是否有一个最佳多项式时间算法可用于此。此外,除此之外,没有为问题提供其他细节。
我的想法是,计算输入中每个元素的频率,然后将它们排列在输出中,每次排列每个不同的元素,直到所有频率都用完。
我不确定我的方法。
任何方法/想法的人。
Vorspring和HugoRune建议的算法的python代码:
from collections import Counter, defaultdict
def max_spread(data):
cnt = Counter()
for i in data: cnt[i] += 1
res, num = [], list(cnt)
while len(cnt) > 0:
for i in num:
if num[i] > 0:
res.append(i)
cnt[i] -= 1
if cnt[i] == 0: del cnt[i]
return res
def calc_spread(data):
d = defaultdict()
for i, v in enumerate(data):
d.setdefault(v, []).append(i)
return sum([max(x) - min(x) for _, x in d.items()])
在perl中
@a=(9,9,9,2,2,2,1,1,1);
然后制作一个列表中不同数字计数的哈希表,就像频率表一样
map { $x{$_}++ } @a;
然后重复遍历所有找到的键,键以已知的顺序,并将适当数量的单个数字添加到输出列表中,直到所有键都耗尽
@r=();
$g=1;
while( $g == 1 ) {
$g=0;
for my $n (sort keys %x)
{
if ($x{$n}>1) {
push @r, $n;
$x{$n}--;
$g=1
}
}
}
我确信这可以适用于任何支持哈希表的编程语言
我相信这个简单的算法会奏效:
现在,直觉上这不会给出一个好的传播:
对于{1,1,1,2,3,4}
==
然而,我认为这是最好的传播,你可以得到的评分函数提供。由于离散度分数计算的是距离之和,而不是距离的平方和,因此,只要在其他地方有较大的差距需要补偿,就可以有多个副本靠近。
对于距离平方和分数,问题变得更加困难。也许面试问题取决于应聘者是否认识到评分函数中的这一弱点?
问题内容: 我正准备编写一个基于MPI的代码,以便使用python和MPI4py进行一些计算。但是,按照该示例,我无法将一个numpy向量散布到核心中。这是代码和错误,有人可以帮助我吗?谢谢。 错误结果是: 谢谢。 问题答案: 数据类型不正确。我应该指定数组的类型:
如何在两个属性之后对对象数组进行分组?在以下情况下是否可以使用减少? 例如:按国家和城市将以下数组分组,并对“年龄”属性求和: /*预期结果:*/
问题内容: 现在有很多类似的问题,但是大多数回答了如何删除重复的列。但是,我想知道如何制作一个元组列表,其中每个元组都包含重复列的列名。我假设每一列都有一个唯一的名称。为了进一步说明我的问题: 然后我想要输出: 如果今天您感觉很好,则将相同的问题扩展到行。如何获取元组列表,其中每个元组都包含重复的行。 问题答案: 这是NumPy的一种方法- 样品运行- 进行转换即可,但是对于rows(index)
问题内容: 可以散列吗? 例如,我知道元组的散列是可能的: 但是可以对a进行哈希处理吗? 可能的解决方案: 这里是对列表哈希的非常深入的解释。 问题答案: 就试一试吧: 所以,你可以得到的,并因为是不可变的,你不能做到这一点,并因为他们是可变的。
问题内容: 我想显示一些观点。这是我的代码: 和我一样: 所以我有两种不同颜色的点。但是我也想有两个不同的标记。我该怎么做?给出一个错误。 问题答案: 每个标记可以使用一个散点图。
在SDA中输入std代码时,我输入了带有零的std代码,但为什么零不在显示数组时的值中?