Berkus
Что это такое
есть двусвязный список с дополнительным указателем, который ссылается на любой произвольный узел в дереве
Ivan
В смысле на произвольный?
Berkus
нужно сделать дубликат этого списка, чтобы в новом списке этот указатель указывал на такие же ноды но в новой копии, за O(1) памяти кажется
Ivan
Это эзотерическая структура данных?
Berkus
Зачем?
это задачка со специальной олимпиады, что значит ЗАЧЕМ
Berkus
а по времени?
O(N) тебе хватит
Evgenii
O(N) тебе хватит
за квадрат вижу тривиальное решение
Ivan
Ничего не понял, нарисуй со связями первоначальный трёх связный список?
Berkus
за O(N) по-моему делается, там надо два или три прохода по списку
Ivan
Как это выглядит?
Berkus
у меня где-то есть картинка, но я ща на лепру доступа не имею, а где ее на диске искать хз )
Matwey
если известно куда указывает 3й указатель, то в чём проблема?
В том что после копирования он должен указывать на аналогичный элемент но "нового" списка
Evgenii
если известно куда указывает 3й указатель, то в чём проблема?
в том что у тебя нет связи между старыми и новыми нодами)
Andrew
а, понел
Matwey
Я канонического решения не знаю, но на мой взгляд тут нужно догадаться вспомнить, что из односвязного списка можно восстановить двухсвязный
Berkus
там насколько я понял из своего решения, надо строить interweaved list
Matwey
И тогда одно из полей можно попользовать как отображение
Berkus
типа node1->next указывает на ноду из второго списка, а она указывает на ноду из первого, а та снова на ноду из второго
Berkus
тогда они получается идут парами
Berkus
ну и короче сначала второй список впендюриваешь промеж элементов первого, второй проход поправляет указатели на третью ноду и потом третий проход разделяет списки обратно на два
Berkus
все без доп памяти
Andrew
ну вообще, можно считерить — прономеровать ноды ))
Andrew
и тогда за O(N) можно скопировать
Berkus
по условиям задачи читерить нельзя *shrug*
Andrew
тогда при копировании сделать массив с номерами и указателями
Anatoly
массив нельзя
Matwey
там насколько я понял из своего решения, надо строить interweaved list
А я по другому придумал. Первый проход в прямом направлении, для каждого элемента создается элемент нового списка, как при простом копировании. Обратную связь старого списка мы ломаем и пишем туда указатель на элемент из нового списка который "соответсвует" старому. Третий указатель копируем временно as-is.
Evgenii
копируем ноды пока не доходим до ноды на которую указывает текущая?
Andrew
да, не будет
Berkus
из N1.1<->N1.2->N1.3 получаю N1.1<->N2.1<->N1.2<->N2.2<->N1.3<->N2.3
Andrew
вот изврат ))
Andrew
но забавно
Ivan
👍
Andrew
это мне напоминает вопрос: как в С передать строку ПО ЗНАЧЕНИЮ ))
Andrew
а не по указателю
Aidar
strcpy
Ivan
Мне вообще не нравится это словосочетание "по значению". Я предлагаю говорить копированием.
Andrew
strcpy
забыл уточнить, что передавать надо в функцию
Aidar
это мне напоминает вопрос: как в С передать строку ПО ЗНАЧЕНИЮ ))
тут в си проблема в том что непонятно как памать манаджить при этом
Ivan
Раньше я путал с передачей по ссылке. Для меня это было одно и тоже.
Ivan
Что такое "значение"?
Andrew
так вот ответ был такой: положить строку в структуру и её передать ))
Aidar
и чо будет?
Aidar
яннп
Andrew
Раньше я путал с передачей по ссылке. Для меня это было одно и тоже.
это можно запомнить так: по значению, когда создаётся копия
Ivan
так вот ответ был такой: положить строку в структуру и её передать ))
Но это уже передача структуры, а не строки - другой тип. А в структуре всё равно указатель на строку
Andrew
и чо будет?
будет решение синтетической задачи )
Berkus
в структуре сама строка, массивом
Ivan
Смотря как ее положить
Aidar
Berkus
struct S { char string_here[100]; }
Ivan
Ну так да
Ivan
это можно запомнить так: по значению, когда создаётся копия
Вот зачем запоминать, проще говорить "передача копированием"
Aidar
по значению это устоявшийся термин
Ivan
Он устарел
Aidar
чем
cyberzx 🇷🇺
Он устарел
с чего бы это?
Ivan
Он не отражает суть сего действа
Ivan
Когда вы передаёте int и const int&, то нет разницы по количеству копирования. Но это смущает молодые умы и они всё копируют! Термин "По значению" не отражает суть
Ivan
В смысле для примитивных типов нет разницы
Matway
Он бессмысленный - это правда. Спорил на собеседовании - это зря.
Крылатый
Лучше просто const int передавать.
Berkus
ну мы все сойдемся во мнении что интервьюер бессмысленный, я думаю
Крылатый
А ещё лучше int&&!
Ivan
Berkus Я имею ввиду неважно как 4 байта передаешь в виде указателя и самого числа
Ivan
Вот чувак, потом начинает всё передавать по значению. Это плохо. Термин не говорит, что происходит копирование
Крылатый
Ваще это уже проблема необразованности какая-то.
Ivan
Плохая семантика
cyberzx 🇷🇺
Не вижу никакой бессмысленности
Berkus
Berkus Я имею ввиду неважно как 4 байта передаешь в виде указателя и самого числа
если в виде указателя - то надо его дереференсить потом, это еще один memory access