Как искать попытки с середины - PullRequest
0 голосов
/ 06 февраля 2019

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

foo {
  bar {
    baz {
      hello {
        world {
          123 {
            456 {
              abc {
                xyz
              }
            }
          }
        }
      }
    }
  }
}

Это очень сокращенная версия.В действительности это может быть двоичный файл с сотнями уровней, например 10101011011010100110000101......, например:

1 {
  0 {
    1 {
      0 {
        1 {
          ...
        }
      }
    }
  }
}

Но в упрощенном примере со строковыми ключами полный путь выглядит следующим образом:

foo/bar/baz/hello/world/123/456/abc/xyz

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

foo/bar/baz/hello/world/123/

Или вы можете найти его здесь:

foo/bar/baz/

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

Но мне интересно другое.Мне интересно , как начать где-то в середине дерева .Так, например, я хочу сопоставить так:

/world/123/456/

В основном как регулярное выражение */world/123/456/*, где оно соответствует в середине .

То есть, если дерево плотное, то теоретически могут быть тысячи или даже миллион узлов, разбросанных по дереву.Поэтому сопоставление 5 слоев вниз, как в /world/123/456/, может означать сканирование тысяч узлов верхнего уровня, прежде чем мы найдем совпадение.

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

1 Ответ

0 голосов
/ 07 февраля 2019

Технически, каждый узел в дереве все еще является деревом.Вы можете рассматривать это как корень этого поддерева.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...