powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Уникальный string-based идентификатор узла дерева - как получить?
14 сообщений из 14, страница 1 из 1
Уникальный string-based идентификатор узла дерева - как получить?
    #33998336
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Такой вопрос:
В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным.
Подробности:
Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя.

У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.)

Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения?
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #33998961
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVЗдравствуйте!
Такой вопрос:
В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным.
Подробности:
Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя.

У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.)

Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения?

Завести справочник и хранить числовые индексы.
Потом индексам формировать строку заново.
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #33999412
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- ErVЗдравствуйте!
Такой вопрос:
В памяти имеется "дерево" данных - т.е. есть "узел"(node) у него есть потомки и т.д. Каждый узел обладает текстовым именем, которое не является уникальным. Нужно получить тектовое представление имени которое было бы для узла дерева было бы уникальным.
Подробности:
Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.). (там полностью закрытый объект, который можно копировать, но он будет хранить в себе тот самый укзатель, но доступ к нему будет закрыт для меня полностью). Исходников нет, переписать нельзя.

У узла можно запросить текстовую строку , в которой через знак '|' будут записано столько имен родителей (ну, по порядку - от корня к узлу), чтобы полученная строка была уникальной для этого узла дерева. Можно также получить полный путь от корня к узлу. Проблема в том, что получающаяся строка слишком длинная для текущих задач. (она пишется в файл определенного формата, через опять же через не мной написанный API. А там на неё ограничения - только английские буквы/цифры, знак подчерка и все. Без пробелов. Формат нельзя сменить. API тоже.)

Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения?

Завести справочник и хранить числовые индексы.
Потом индексам формировать строку заново.
Числовые индексы и справочник чего? строк? Или их частей? Справочник нельзя будет сохранить в конечный файл, ради чего все и нужно.
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #33999539
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Числовые индексы и справочник чего? строк? Или их частей? Справочник нельзя будет сохранить в конечный файл, ради чего все и нужно.


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

Вам виднее, для более конкретного ответа на вопрос недостаточно информации.
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #33999714
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходя из этого
ErV
Подробности:
Дерево воплощено не мной, и указатель на узел недоступен (хотя это был бы идеальный вариант - добавить hex представление после имени.).


Я не думал что вы его собираетесь хранить в файле.

Вы точно знаете, что используемая вами библиотека дерева
всегда гарантирует размещение узлов по определенным(извесным) адресам?
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #33999903
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема на данный момент отчасти разрешилась и уже не "горит", но такую проблему решать придется ещё не раз, так что тему закрывать ещё рано :)

Гарантии того, что указатель будет уникальным, к сожалению, нет. :(

=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".
Вот полное изложение проблемы. :)
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34000384
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Каждое последующее повторяющееся имя заменяется
номером узла в котором оно появилось впервые.
Чем больше повторений в строке тем выше экономия.
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34001621
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVЗдравствуйте!
Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения?

я для такой же задачи пользуюсь crc64
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34001643
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант с подсчетом количеств повторений не прокатит, так как повторяться может часть строки. Это уже mini-zip нужен. :)

Lepsik ErVЗдравствуйте!
Соответственно, нужен какой-то принцип, по которому можно было бы из уникальной, но длинной строки, поулчить настолько же уникальное (или с большой вероятностью настолько же уникальное) текстовое "сжатое" представление. Какие есть варианты решения?

я для такой же задачи пользуюсь crc64
Спасибо за совет. Иду искать ссылки на алгоритм... (если подскажите, буду очень признателен).
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34002572
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приложил. кстати для wchar_t следует перевести в multibyte а то будет плохо считать
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34004024
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsikприложил. кстати для wchar_t следует перевести в multibyte а то будет плохо считать
Большое спасибо :).
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34004228
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно посчитать мд5 и перексорить половинки по 8 байт :)
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34004459
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно перенять опыт у XML технологий. Там существует возможность быстро получить уникальный GID для элемента (атрибута, ноды) документа. Навскидку не скажу где это описано. Надо по гуглить ...
...
Рейтинг: 0 / 0
Уникальный string-based идентификатор узла дерева - как получить?
    #34004673
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно перенять опыт у XML технологий. Там существует возможность быстро получить уникальный GID для элемента (атрибута, ноды) документа. Навскидку не скажу где это описано. Надо по гуглить ...

чтобы его получить, его надо перед этим создать, тока человеку не надо такой длиныый ключ - он спрашивает короткий и чтобы можно было экономный path построить
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Уникальный string-based идентификатор узла дерева - как получить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]