如何从$ names [],$ surnames []生成唯一的全名?

时间:2011-07-02 15:58:05

标签: arrays algorithm generator

我有两个数组(实际大小是10倍大):

$names = array(
    'James',
    'John',
    'Robert',
    'Michael',
    'William'
);

$surnames = array(
    'Smith',
    'Johnson',
    'Williams'
);

我需要生成人的全名。一个人只能有一个姓氏和一个姓氏。全名必须是唯一的!什么是最好的解决方案?

P.S。我不需要所有可能的名字。我认为当不能从给定的数组中创建任何其他唯一的全名时...我会抛出异常!

解决方案#1:

第一个出现在我脑海中的人......

创建一个名为full_names的新数组,并在其中存储生成的名称。存储前,请检查是否已存在此值。随机生成。

这会太慢了!而且很愚蠢。

解决方案#2:

请求StackOverflow.com算法生成所有可能的全名......然后根据需要选择那么多。 不,这听起来也很愚蠢......

2 个答案:

答案 0 :(得分:2)

创建一个(i,j)整数双精度数组,涵盖所有可能的姓氏 - 姓氏组合。随机播放阵列。然后循环遍历数组,并逐一从中获取名称。

您将以随机顺序获得唯一的全名(前提是您的姓名和姓氏列表不包含重复项)。

修改

伪代码,按要求。

首先,执行以下设置步骤:

indexList = emptyList
for i = 1 to length(first_names)
  for j = 1 to length(last_names)
    indexList.push( (i,j) )

shuffle(indexList)

push这里意味着在列表末尾添加一个元素。

现在每次需要一个新名称时,只需从indexList取一个索引对,并从名称数组中返回相应的名称:

function getName()
  (i, j) = indexList.pop()
  return concatenate(first_names[i], " ", last_names[j])

pop这里表示从列表末尾删除一个元素并将其返回。你不可能有这么多名字,indexList应占用太多内存。

答案 1 :(得分:0)

循环显示名字和姓氏,检查您是否已生成该组合。在PHP中:

$full_names = array();
foreach ($names as $first_name) {
    foreach ($surnames as $last_name) {
        $candidate = $first_name . " " . $last_name;
        if (!isset($full_names[$candidate])) {
            $full_names[$candidate] = true;
        }
    }
}

print_r(array_keys($full_names));

在Python中也是如此:

print set([first + ' ' + last for first in names for last in surnames])