как найти цикл в файловой системе?

=QUERY(QUERY(ARRAYFORMULA(TRANSPOSE(SPLIT(JOIN(" ", 
 QUERY(A1:T25, , 10000)), " "))),
 "select Col1,count(Col1) group by Col1 label count(Col1)''"),
 "order by Col2 desc")

0

5
задан Eclipse 22 March 2009 в 20:03
поделиться

6 ответов

Я нашел этот интересный комментарий здесь о нахождении циклов в DAG:

Steinar H. Gunderson записал:

В четверг, 26 февраля 2004 0:28:32 +0100, Orlondow записал:

... также воспроизведенный в Cormen-Leiserson-Rivest, IIC. Который является самым легким найти.

Да, у меня на самом деле есть Cormen и др., но он никогда не ударял меня для поиска "сильно соединенных компонентов", когда я хотел обнаружение цикла. Спасибо, я взгляну на него.:-)

Для нахождения цикла в ориентированном графе (Вы не заботитесь, который циклом) как долго как там существует один, Вы не должны идти за борт с SCC. Простой поиск в глубину DFS (в той же главе СБРАСЫВАЕТ) достаточно.

Так, примерно разговор, в то время как Вы пересекаете дерево каталогов, создает DAG, который представляет структуру дерева с данными в узле, относящемся к inode файла. Затем Вы просто проверяете, чтобы удостовериться, что Вы не посещаете узел несколько раз.

1
ответ дан 13 December 2019 в 19:36
поделиться

Простой путь. Просто сделайте обход дерева в глубину дерева каталогов, сохранив стопку узлов выше Вас, когда Вы идете. В каждом узле Вы посещаете, если тот узел уже находится в стеке, у Вас есть цикл.

 // here's a stack of nodes
node stack[1000];

walk(node, level){
    if (node in stack[0..level-1]) then there is a cycle
    else
        stack[level] = node
        for each subnode x of node
            walk(x, level+1)
}
1
ответ дан 13 December 2019 в 19:36
поделиться

Возможно, я немного тускл здесь, но не являюсь этими двумя способами, которыми Вы могли создать цикл:

  • путем создания символьной ссылки
  • путем монтирования чего-то дважды

Для контакта с ними можно получить список монтирования, прежде чем Вы начнете индексировать и ifnore все кроме первой из той же фс, и можно проигнорировать ссылки, поскольку Вы сталкиваетесь с ними в процессе индексации.

1
ответ дан 13 December 2019 в 19:36
поделиться

Это более обычно упоминается как "цикл". Таким образом, Вы хотите реализовать "обнаружение цикла". Существует много способов сделать это; я не знаю, ли это для домашней работы или не, но одно простое, не обязательно самое оптимальное, метод посредством преследования указателя.

0
ответ дан 13 December 2019 в 19:36
поделиться

Как другие сказали, нет такой вещи как цикл в файловой системе, если Вы понимаете, что путь является частью имени файла, если это не циклическая символьная ссылка.

Например, если Вы загружаетесь, некоторый дистрибутив (позволяет, говорят, что Debian), к циклическому устройству, или даже к каталогу, и делают это НА машине Debian, Вы теперь копировали много вещей.

Например, позволяет, говорят, что Вы выполняете Debian Lenny и загружаете минимальную копию ее к/lenny.

/lenny/usr /* собирается совпасть с/usr /*. Нет никакого 'дешевого' способа избежать этого.

Так как Вы уже называете статистику () на каждом узле (я предполагаю, что Вы используете ftw () / ftw64 (), Вы можете также:

  • Имейте ftw (), обратный вызов вставляет имя узла в массив, который имеет элементы структуры, которые могут сохранить хеш файла, который вряд ли столкнется. md5 не собирается сокращать его для этого.
  • Обновите хеш-таблицу на основе того обзора, и имя файла (не соединяют каналом).

Это не находится ни в какой опасности ускорить Ваше сканирование, но оно значительно сократит вовремя, оно берет для поиска.

Если Вы используете потоки правильно и устанавливаете привязку, хеширование и индексация могут произойти на одном ядре, в то время как другой связанный i/o (когда несколько ядер доступны).

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

1
ответ дан 13 December 2019 в 19:36
поделиться

Общий способ предотвратить узлы повторного сканирования в графике состоит в том, чтобы отметить узлы, поскольку Вы передаете их и затем игнорируете узлы, которые отмечены. Это не ужасно практично, если Вы не хотите изменять график, Вы сканируете, таким образом, Вам нужен способ отметить узлы внешне. Самым легким путем я могу думать, чтобы сделать, это в соответствии с Linux должно было бы сохранить device/inode для каждого каталога, который Вы посещаете. Затем при рассмотрении каталога сначала проверьте, что Вы уже не видели каталогов с тем же device/inode. Это не только обрабатывает циклы, но также и деревья, которые объединяются назад друг в друга.

Для получения device/inode числа смотрят на функции stat/fstat и st_dev и st_ino членов структуры статистики.

Для того, чтобы хранить данные, Вы, вероятно, желаете посмотреть на хеш-таблицу или двоичное дерево.

5
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

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