Разделите список наборов общими элементами

Попробуйте скриптовую ссылку




.modal {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1050;
    display: none;
    overflow: hidden;
    -webkit-overflow-scrolling: touch;
    outline: 0;
}
.modal.fade .modal-dialog {
    -webkit-transition: -webkit-transform .3s ease-out;
    -o-transition: -o-transform .3s ease-out;
    transition: transform .3s ease-out;
    -webkit-transform: translate(0, -25%);
    -ms-transform: translate(0, -25%);
    -o-transform: translate(0, -25%);
    transform: translate(0, -25%)
}
.modal.in .modal-dialog {
    -webkit-transform: translate(0, 0);
    -ms-transform: translate(0, 0);
    -o-transform: translate(0, 0);
    transform: translate(0, 0)
}
.modal-open .modal {
    overflow-x: hidden;
    overflow-y: hidden;
}
.modal-dialog {
    position: relative;
    width: auto;
    margin: 10px
}
.modal-content {
    position: relative;
    background-color: #fff;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    border: 1px solid #999;
    border: 1px solid rgba(0, 0, 0, .2);
    border-radius: 6px;
    outline: 0;
    -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
    box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
.modal-header {
    padding: 15px;
    border-bottom: 1px solid #e5e5e5;
    background-color: #F7F8FA;
}
.modal-header .close {
    margin-top: 5px
}
.modal-header .back {
    margin-top: 5px
}
.modal-title {
    margin: 0;
    line-height: 1.42857143
}
.modal-body {
    position: relative;
    padding: 15px;
    height:350px!important;
    overflow-y:auto;
    overflow-x:hidden;
}
.modal-footer1 {
    padding:15px;
    border-top: 1px solid #e5e5e5;
    background-color: #F7F8FA;
}

@media(max-width:767px){
  #step-modal{
    padding:0px !important;
  }
  .modal-dialog{
    margin: 0px;
  }
}

.

5
задан itsadok 7 October 2008 в 15:44
поделиться

4 ответа

Проблемой является точно вычисление связанных компонентов гиперграфа: целые числа являются вершинами, и наборы являются гиперкраями. Обычный способ вычислить связанные компоненты путем лавинной рассылки их один за другим:

  • для всего я = 1 к N, сделайте:
  • если я был отмечен некоторым j <я, то продолжаю (я значу пропуск для следующего i),
  • еще flood_from (я, i)

где flood_from (я, j) был бы определен как

  • для каждого набора S содержащий меня, если это уже не отмечено j затем:
  • отметьте S на j и для каждого элемента k S, если k уже не отмечен j, то отметьте его j и назовите flood_from (k, j)

Теги наборов затем дают Вам связанные компоненты, которые Вы ищете.


С точки зрения баз данных алгоритм может быть выражен следующим образом: Вы добавляете столбец TAG к своей базе данных, и Вы вычисляете связанный компонент набора i путем выполнения

  • S = выберите все строки где set_id == я
  • ТЕГ набора мне для строк в S
  • S = выбирает все строки, где ТЕГ не установлен и где элемент в своей стихии (S)
  • в то время как S не пуст, сделать
  • ----ТЕГ набора мне для строк в S
  • ----S'' = выбирают все строки, где ТЕГ не установлен и где элемент в своей стихии (S')
  • ----S = S объединение S
  • ----S = S''
  • возвратите set_id (S)

Другой (теоретический) способ представить этот алгоритм состоял бы в том, чтобы сказать поиск фиксированных точек отображения:

  • если = {A1...} является рядом наборов, определите объединение (A) = объединение A1... объединение
  • если K = {k1..., kp} является рядом целых чисел, определите падения (K) = набор наборов, которые пересекают K

Затем, если S является набором, связанный компонент S получен путем итерации (падения) o (объединение) на S, пока фиксированная точка не достигнута:

  1. K = S
  2. K' = падения (объединение (K)).
  3. если K == K', затем возвращают K, еще K = K' и переходят в 2.
6
ответ дан 14 December 2019 в 09:05
поделиться

Вы могли думать о нем как о проблеме графика, где набор (1,2,3) подключен к набору (5,2,6) через 2. И затем используйте стандартный алгоритм для штрафа связанные подграфы.

Вот быстрая реализация Python:

nodes = [ [1,2,3], [2,4,5], [6,7,8], [10,11,12], [7,10,13], [12], [] ]
links = [ set() for x in nodes ]

#first find the links
for n in range(len(nodes)):
    for item in nodes[n]:
        for m in range(n+1, len(nodes)):
            if (item in nodes[m]):
                links[n].add(m)
                links[m].add(n)

sets = []
nodes_not_in_a_set = range(len(nodes))

while len(nodes_not_in_a_set) > 0:
    nodes_to_explore = [nodes_not_in_a_set.pop()]
    current_set = set()
    while len(nodes_to_explore) > 0:
        current_node = nodes_to_explore.pop()
        current_set.add(current_node)
        if current_node in nodes_not_in_a_set:
            nodes_not_in_a_set.remove(current_node)
        for l in links[current_node]:
            if l not in current_set and l not in nodes_to_explore:
                nodes_to_explore.append(l)
    if len(current_set) > 0:
        sets.append(current_set)

for s in sets:
    print [nodes[n] for n in s]

вывод:

[[]]
[[6, 7, 8], [10, 11, 12], [7, 10, 13], [12]]
[[1, 2, 3], [2, 4, 5]]
1
ответ дан 14 December 2019 в 09:05
поделиться

Это, вероятно, довольно неэффективно, но это должно работать, по крайней мере: Запустите с ключа, выберите все группы, содержащие тот ключ, выберите все ключи тех групп, выберите все группы, содержащие те ключи, и т.д., и как только шаг не добавляет новых ключей или групп, у Вас есть список всех групп одного подграфа. Исключите их и повторитесь с начала, пока Вы не будете иметь данных в запасе.

С точки зрения SQL этому была бы нужна хранимая процедура, я думаю. С РЕКУРСИВНЫМ мог бы помочь Вам так или иначе, но у меня еще нет опыта с ним, и я не уверен, что это доступно на Вашем бэкенде DB.

0
ответ дан 14 December 2019 в 09:05
поделиться

После размышления об этом еще немного я придумал это:

  1. Составьте названную таблицу groups со столбцами (group_id, set_id)
  2. Отсортируйте sets таблица element. Теперь должно быть легко найти дублирующиеся элементы.
  3. Выполните итерации через таблицу наборов, и когда Вы находите, что дублирующийся элемент делает:
    1. если один из set_id поля существуют в groups таблица, добавляет другая с тем же group_id.
    2. Если ни один set_id существует в groups таблица, генерируйте новый идентификатор группы и добавьте обоих set_ids к groups таблица.

В конце у меня должен быть a groups таблица, содержащая все наборы.

Это не чистый SQL, но походит на O (nlogn), таким образом, я предполагаю, что могу жить с этим.

Ответ Matt кажется более корректным, но я не уверен, как реализовать его в моем случае.

0
ответ дан 14 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: