Russian Qt Forum
Апрель 17, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Быстрая вставка  (Прочитано 18332 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 06, 2019, 16:01 »

Добрый день

1) Есть такой контейнер
Цитировать
Sphere 1
Cube 1
Cube 3
Sphere 2
Sphere 5
Т.е. базовые имена (Sphere и Cube) идут в произвольном порядке, а вот номера уникальны (в пределах базового имени) и идут по возрастающей. Нужно вставить в этот контейнер другой с теми же базовыми именами но произвольными индексами, напр
Цитировать
Cube 2
Cube 3
Cube
Cube
Sphere 1
В рез-те должно получиться
Цитировать
Sphere 1   // override
Cube 1     
Cube 2      // insert   
Cube 3      // override
Cube 4      // insert with new index
Cube 5      // insert with new index
Sphere 2
Sphere 5
Не смог придумать способ без перебора  Плачущий  Создавать любые временные контейнеры можно

2)  Все то же, но первый контейнер - такое дерево
Цитировать
Sphere 1
  Cube 1
    Cone 1
Sphere 2
  Cube 2
Sphere 5
  Cube 5
    Cone 5

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Август 07, 2020, 12:24 »

Контейнер проиндексировать придется, естественно.
Что то типа QMap<QString, QPair<int,int>> то есть <key, <number,line>>
Например будет так для примера 1:
<Sphere <1,1><2,4><5,5>>
<Cube <1,2><3,3>
Ну а дальше уже дело техники.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Август 07, 2020, 13:00 »

1. отсортировать оба массива так чтобы номера без индексов были в конце пачки (а не в начале). например, можно для удобства сперва декомпозироваь строку на пару - ключ/номер
2. параллельно пробежаться по массивам склеивая сортированные пачки - примерно как делает std::merge/std::set_union и друзья, только помимо склейки надо считать кол-во элементов в "пачке" и если встретился элемент без номера, присваивать ему новый номер.

Хорошая задачка на собеседование.
Интересно можно ли за O(M+N) сделать?..
« Последнее редактирование: Август 07, 2020, 13:13 от Авварон » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 08, 2020, 12:23 »

Контейнер проиндексировать придется, естественно.
Что то типа QMap<QString, QPair<int,int>> то есть <key, <number,line>>
Например будет так для примера 1:
<Sphere <1,1><2,4><5,5>>
<Cube <1,2><3,3>
Ну а дальше уже дело техники.
Наверное значение мапы - вектор пар. В любом случае если line - индекс строки, то он "уплывет" после первой же вставки

параллельно пробежаться по массивам склеивая сортированные пачки - примерно как делает std::merge/std::set_union и друзья,
Дело осложняется тем что пачек (по первому ключу) может быть сколько угодно, и они идут не подряд

Наверно сначала нужно упаковать идущие подряд, т.е.

Sphere <1, 1>
Cube <1, 1>
Cube <3, 3>
Sphere <2, 2>
Sphere <5, 5>

Теперь нужно вставить "Cube 2", возможно ли его найти пачку для него в массиве выше используя lower_bound ? Очевидно "просто так" нет, мешает первый ключ. А может как-то "непросто"?
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #4 : Август 08, 2020, 15:42 »

а если сначала на бд потренироваться?
а потом бустовые индексы прикрутить.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 09, 2020, 09:12 »

а если сначала на бд потренироваться?
а потом бустовые индексы прикрутить.
Ну как-то оно смотрится "инородным телом", да и хлопот с "прикручиванием" немало. Кстати не знаю умеет ли БД такое делать

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Сентябрь 01, 2020, 14:55 »

Хорошая задачка на собеседование.
Интересно можно ли за O(M+N) сделать?..

Принципиально отказываюсь от собеседований "с задачами", особенно с такой идеологией.
Как бы "шашечки или ехать"?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #7 : Сентябрь 01, 2020, 15:17 »

Принципиально отказываюсь от собеседований "с задачами", особенно с такой идеологией.
Как бы "шашечки или ехать"?

Если кандидат не в состоянии распознать и написать set_union/set_intersect, то зачем такой кандидат нужен? Я, собственно, люблю задачки которые в завуалированном виде мапятся на стандартный алгоритм - тогда даже не требуется реализовывать этот алгоритм, главное чтобы кандидат понял что это конкретный алгоритм, сумел преобразовать данные к виду в котором алгоритм применим, и применил его. Как follow up можно поговорить о том, как алгоритм устроен, в простых случаях (как этот) можно и попросить написать. Или уже параллельно пробежаться по двум массивам оказывается непосильной задачей?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Сентябрь 01, 2020, 18:30 »

Хорошая задачка на собеседование.
Интересно можно ли за O(M+N) сделать?..

Принципиально отказываюсь от собеседований "с задачами", особенно с такой идеологией.
Как бы "шашечки или ехать"?

Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #9 : Сентябрь 01, 2020, 18:39 »

Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.

Вот потому ты и не в гугле=) Впрочем, я тоже Грустный

Ну а что спрашивать? Знает ли человек что такое деструкторы? Это хорошо если ты на конкретную вакансию идешь, гуглы же нанимают толкового чувака а та уже куда получится его приткнуть по навыкам. Поэтому и оценивается алгоритмический скилл не привязываясь к языку.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Сентябрь 01, 2020, 19:10 »

Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.

Вот потому ты и не в гугле=) Впрочем, я тоже Грустный

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

Это проблема гугла, не находишь? Смеющийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Сентябрь 02, 2020, 11:53 »

...в простых случаях (как этот) можно и попросить написать. Или уже параллельно пробежаться по двум массивам оказывается непосильной задачей?
А как пробегаться? Напр исходный массив
Цитировать
Cube 1
...
И нужно вставить "Cube 10". Я обязан просматривать исходный массив пока не обнаружу "Cube >= 10" или до упора. Только после этого могу вставлять или реплейсить. И после первой же вставки номера строк изменятся, как-то сохранять их (для 2 и более вставляемых) не выходит
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 03, 2020, 09:18 »

Я, собственно, люблю задачки которые в завуалированном виде мапятся на стандартный алгоритм
Кстати здесь есть такая (или подобная) возможность. Как работает пресловутый O(log(N)): отрезок (контейнер) делится пополам, и, в зависимости от рез-та сравнения, операция повторяется с левой или правой частью.

Здесь прямолинейно использовать такое нельзя, мешает первый ключ. Но можно немного изменить стандартный алгоритм:

- делим отрезок пополам, если первый ключ "наш" ("Cube" в примере выше), то продолжаем как обычно. Иначе рекурсивно ищем в обеих частях. Правда нужно немного помозговать как сравнить рез-ты обеих частей - но это решаемо. Конечно эффективность будет не log(N), а меньше в зависимости от числа первых ключей. Но решение 100% "общее"

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #13 : Сентябрь 03, 2020, 11:01 »

Я же написал - предварительно отсортировать так что номера без номеров будут в конце. Тогда присвоить им уникальные номера - задача тривиальная.
Ну да, типа будет N*log(N) сортировка - надо быстрее - давайте обсудим.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 03, 2020, 11:42 »

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

Ну да, типа будет N*log(N) сортировка - надо быстрее - давайте обсудим.
Как сделано сейчас: для каждого вставляемого (напр "Cube 10") просматривается весь массив до обнаружения "Cube >= 10", наилучшая позиция вставки запоминается. Напр нашли "Cube 5" в позиции (по-простому "в строке") 44, значит фиксируем: место вставки 44+1 = 45. Но еще не вставляем, ведь может найдется "Cube 7" и.т.п. Наконец весь массив просмотрен, вставляем в запомненное место, если оно -1 (вообще нет никаких "Cube"), то просто в конец.

Сейчас это вполне устраивает, необходимости выжимать скорость здесь нет. Но все-таки "перебор = визитная карточка лоха", интересно как без него. Не менее (а может и более) интересно как это сделать "технично", не размазывая текст на много страниц.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 23.