|
|
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Такой вопрос: В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным. Подробности: Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя. У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.) Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 02:10 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
ErVЗдравствуйте! Такой вопрос: В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным. Подробности: Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя. У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.) Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения? Завести справочник и хранить числовые индексы. Потом индексам формировать строку заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 11:19 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
onstat- ErVЗдравствуйте! Такой вопрос: В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным. Подробности: Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя. У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.) Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения? Завести справочник и хранить числовые индексы. Потом индексам формировать строку заново. Числовые индексы и справочник чего? строк? Или их частей? Справочник нельзя будет сохранить в конечный файл, ради чего все и нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 12:41 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
ErV Числовые индексы и справочник чего? строк? Или их частей? Справочник нельзя будет сохранить в конечный файл, ради чего все и нужно. Справочник названий узлов. Его можно хранить отдельно используя Ваш код, или используя готовую бублиотеку дерева, но это уже будет другое дерево. А может быть часть(одна ветка) вашего уже существующего. Вам виднее, для более конкретного ответа на вопрос недостаточно информации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 13:06 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
Исходя из этого ErV Подробности: Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). Я не думал что вы его собираетесь хранить в файле. Вы точно знаете, что используемая вами библиотека дерева всегда гарантирует размещение узлов по определенным(извесным) адресам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 13:43 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
Проблема на данный момент отчасти разрешилась и уже не "горит", но такую проблему решать придется ещё не раз, так что тему закрывать ещё рано :) Гарантии того, что указатель будет уникальным, к сожалению, нет. :( =onstat- Справочник названий узлов. Его можно хранить отдельно используя Ваш код, или используя готовую бублиотеку дерева, но это уже будет другое дерево. А может быть часть(одна ветка) вашего уже существующего. Вам виднее, для более конкретного ответа на вопрос недостаточно информации. Более подробная информация: Дерево представляет собой SceneGraph 3D-редактора. Узел представляет собой абстрактный объект, обладающий именем, которое НЕ является уникальным. Однако уникальным является последовательность имен этого узла и его родителей. Далее все объяснено на примере абстрактного "дерева".(плюсами обозначил вложения/потомков. В кавычках - их текстовые имена): root +Node1 "NodeA" (parent==root); ++Node2 "NodeB" (parent==Node1); ++Node3 "NodeC" (parent==Node1); ++Node4 "NodeA" (parent==Node1); +++Node5 "NodeA" (parent==Node4); Есть три одноименных узла. Для каждого из них можно можно получить имя ("NodeA" для Node4, Node5, Node1), полный путь ("root|NodeA|NodeB" - для Node2, "root|NodeA|NodeA" для Node4 и "root|NodeA|NodeA|NodeA" для Node5.), который является уникальным. Можно получить "уникальный сокращенный путь" - т.е. текстовую строку с достаточным числом родителей, чтобы данное имя стало уникальным среди подобных имен для всех узлов дерева: "NodeB"для Node2, "NodeC" для Node3, "NodeA" для Node1, "NodeA|NodeA" для Node4, "NodeA|NodeA|NodeA" для Node5. Другого инструментария кроме получения этих строк фактически нет. Соответственно, хотелось бы зделать так, чтобы к короткому имени можно было добавить некую текстоую "сигнатуру" (из десятичных цифр, например) которая сделала бы полученную строку гарантированно уникальной, но чтобы полученная была строка была бы короче чем полный или частичный путь к узлу. Я пробовал добавлять после короткого имени CRC(сумму всех значений символов полного пути и длину)и длину полного пути, но все равно это не решение - "NodeA|NodeB|NodeC" будет эквивалентен "NodeB|NodeA|NodeC". Вот полное изложение проблемы. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 14:30 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
ErV root +Node1 "NodeA" (parent==root); ++Node2 "NodeB" (parent==Node1); ++Node3 "NodeC" (parent==Node1); ++Node4 "NodeA" (parent==Node1); +++Node5 "NodeA" (parent==Node4); Есть три одноименных узла. Для каждого из них можно можно получить имя ("NodeA" для Node4, Node5, Node1), полный путь ("root|NodeA|NodeB" - для Node2, "root|NodeA|NodeA" для Node4 и "root|NodeA|NodeA|NodeA" для Node5.), который является уникальным. Можно получить "уникальный сокращенный путь" - т.е. текстовую строку с достаточным числом родителей, чтобы данное имя стало уникальным среди подобных имен для всех узлов дерева: "NodeB"для Node2, "NodeC" для Node3, "NodeA" для Node1, "NodeA|NodeA" для Node4, "NodeA|NodeA|NodeA" для Node5. Другого инструментария кроме получения этих строк фактически нет. Соответственно, хотелось бы зделать так, чтобы к короткому имени можно было добавить некую текстоую "сигнатуру" (из десятичных цифр, например) которая сделала бы полученную строку гарантированно уникальной, но чтобы полученная была строка была бы короче чем полный или частичный путь к узлу. Вот пример как можно поступить : root|NodeA|NodeB|NodeA|NodeC|NodeA|NodeC|NodeB Будет выглядеть root|NodeA|NodeB|1|NodeC|1|4|2 Каждое последующее повторяющееся имя заменяется номером узла в котором оно появилось впервые. Чем больше повторений в строке тем выше экономия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 16:00 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
ErVЗдравствуйте! Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения? я для такой же задачи пользуюсь crc64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 00:48 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
вариант с подсчетом количеств повторений не прокатит, так как повторяться может часть строки. Это уже mini-zip нужен. :) Lepsik ErVЗдравствуйте! Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения? я для такой же задачи пользуюсь crc64 Спасибо за совет. Иду искать ссылки на алгоритм... (если подскажите, буду очень признателен). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 02:10 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
приложил. кстати для wchar_t следует перевести в multibyte а то будет плохо считать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 12:22 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
Lepsikприложил. кстати для wchar_t следует перевести в multibyte а то будет плохо считать Большое спасибо :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 17:12 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
можно посчитать мд5 и перексорить половинки по 8 байт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 18:14 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
Можно перенять опыт у XML технологий. Там существует возможность быстро получить уникальный GID для элемента (атрибута, ноды) документа. Навскидку не скажу где это описано. Надо по гуглить ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 20:02 |
|
||
|
Уникальный string-based идентификатор узла дерева - как получить?
|
|||
|---|---|---|---|
|
#18+
maytonМожно перенять опыт у XML технологий. Там существует возможность быстро получить уникальный GID для элемента (атрибута, ноды) документа. Навскидку не скажу где это описано. Надо по гуглить ... чтобы его получить, его надо перед этим создать, тока человеку не надо такой длиныый ключ - он спрашивает короткий и чтобы можно было экономный path построить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 23:34 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34001621&tid=2030464]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 428ms |

| 0 / 0 |
