2015-02-25 4 views
2

У меня есть массив, состоящий из 1,5 миллионов пара элементов (разделенный ' «):PHP элементов быстрой кластеризации, хранящиеся в массиве

$array { 
    [0] => "element1 element2" 
    [1] => "element2 element3" 
    [2] => "element8 element4" 
    [3] => "element8 element5" 
    [4] => "element4 element5" 
    [5] => "element6 element7" 
    [6] => ... 
}  

Каждая пара элемента является уникальной, и элементы представляют собой строки от 15 до 20 символов.

В моем конвейере этот массив означает [0] «элемент1 связан с элементом2», [1] «элемент2 связан с элементом3», ... Я хотел бы объединить все связанные элементы и получить вывод похожие на:

$array_output { 
     [0] => "element1 element2 element3" 
     [1] => "element8 element4 element5" 
     [2] => "element6 element7" 
     [3] => ... 
} 

Я думаю, эта задача очень проста, и я, вероятно, отсутствует очевидный способ сделать это, но я не нашел быстрый способ группироваться мои элементы (т.е. от нескольких минут до нескольких несколько часов).

+0

Я не считаю эту задачу простой и не знаю, как это сделать. Я, вероятно, предлагаю взрываться в пространстве, а затем создавать вложенную иерархическую структуру. Затем напишите что-нибудь, чтобы сгладить эту структуру в нужные группы. –

+2

Я бы очень не хотел делать это в памяти PHP с таким большим количеством пар и вместо этого обрабатывал его в базе данных. –

+0

Я не думаю, что это так проблематично. Если я не понял вопрос, это можно сделать в O (n) времени и пространстве, где n - количество пар на входе (см. Мой ответ). – gandaliter

ответ

0

У вас есть график, представленный как список смежности, и вы хотите преобразовать его в список подключенных компонентов графика. Лучший способ сделать это - построить наборы узлов, которые подключены, и объединить их для каждого ребра, пока у вас не будет больше ребер.

Чтобы сделать это в PHP:

  1. Преобразование входных данных для многомерного массива ([["element1", "element2"],["element2","element3"]] и т.д.)
  2. Инициализируют список узлов в представлении карты с каждым узлом, указывая на множество, содержащее только этот узел (например, ["element1" => ["element1"],"element2" => ["element2"]] и т. д.)
  3. Для каждого спаривания в массиве из (1) объедините множества из двух элементов в массиве из (2) и укажите оба элемента, а также любые другие элементы в наборе, чтобы вновь объединенный комплект
  4. Поместите все наборы из (3) в виде набора (наборов), так что вы получите каждый только один раз
  5. Преобразование каждого набора в нужный формат вывода

Вы хотите использовать ссылочный оператор (&), чтобы повторно использовать те же массивы в (3). Алгоритм будет намного проще реализовать на Java или что-то более очевидное hashmaps и hashtables.

+0

Большое спасибо за ваше предложение. Но я боюсь, что я не получу ваш пункт 2 'инициализировать представление карты'. У вас есть пример кода? Благодарю. – zwonoROM

+0

Идея '[]' s заключалась в отображении массивов (я знаю, что это не то, что они выглядят на PHP, но это легче увидеть). Все, что вы действительно делаете на шаге 2, составляет список узлов. Каждый из элементов должен быть в нем ровно один раз и независимо от любых пар. – gandaliter

+0

ОК спасибо, попробует. – zwonoROM