Я продолжаю сталкиваться с такой ситуацией, когда у меня есть ветвь три, и я хочу найти середину вниз.Так, например, у меня может быть такая ветка трия.
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/
, может означать сканирование тысяч узлов верхнего уровня, прежде чем мы найдем совпадение.
Мне интересно, что вы делаете в этой ситуации, какое возможное решение.Все, о чем я могу думать в настоящее время, - это как-то сделать эту среднюю часть ветви своей собственной структурой верхнего уровня где-то, дублируя вложенную часть дерева в другом месте в памяти.Но это кажется действительно неэффективным и расточительным с точки зрения памяти, поэтому мне интересно, как вы могли бы решить эту проблему.