Как сгенерировать уникальные полные имена из $ names [], $ surnames []? - PullRequest
0 голосов
/ 02 июля 2011

У меня есть два массива (фактический размер в 10 раз больше):

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

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

Мне нужно генерировать полные имена людей.Один человек может иметь только одно имя и одну фамилию.Полные имена должны быть уникальными!Какое лучшее решение?

PS Мне не нужны все возможные имена.Я думаю, что когда не может быть никаких других уникальных полных имен из заданных массивов ... я брошу исключение!

Решение № 1:

Первое, что пришло мне в голову ...

Создайте новый массив с именем full_names и сохраните в нем сгенерированные имена.Перед сохранением убедитесь, что такого значения уже нет.Произведите случайным образом.

Это будет так медленно!И глупо.

Решение № 2:

Спросите алгоритм StackOverflow.com для генерации всех возможных полных имен ... и затем возьмите только столько, сколькоЯ нуждаюсь. Нет, это тоже звучит глупо ...

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Создает массив из (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 будет занимать слишком много памяти.

0 голосов
/ 02 июля 2011

Зацикливание на имя и фамилию, проверьте, если вы уже создали эту комбинацию.В 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...