Russian Qt Forum
Ноябрь 22, 2024, 11:03
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Общий
>
Быстрая вставка
Страниц: [
1
]
2
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Быстрая вставка (Прочитано 20394 раз)
Igors
Джедай : наставник для всех
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
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Быстрая вставка
«
Ответ #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
Сообщений: 3260
Re: Быстрая вставка
«
Ответ #2 :
Август 07, 2020, 13:00 »
1. отсортировать оба массива так чтобы номера без индексов были в конце пачки (а не в начале). например, можно для удобства сперва декомпозироваь строку на пару - ключ/номер
2. параллельно пробежаться по массивам склеивая сортированные пачки - примерно как делает std::merge/std::set_union и друзья, только помимо склейки надо считать кол-во элементов в "пачке" и если встретился элемент без номера, присваивать ему новый номер.
Хорошая задачка на собеседование.
Интересно можно ли за O(M+N) сделать?..
«
Последнее редактирование: Август 07, 2020, 13:13 от Авварон
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Быстрая вставка
«
Ответ #3 :
Август 08, 2020, 12:23 »
Цитата: Racheengel от Август 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>
Ну а дальше уже дело техники.
Наверное значение мапы - вектор пар. В любом случае если line - индекс строки, то он "уплывет" после первой же вставки
Цитата: Авварон от Август 07, 2020, 13:00
параллельно пробежаться по массивам склеивая сортированные пачки - примерно как делает 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
Сообщений: 221
Re: Быстрая вставка
«
Ответ #4 :
Август 08, 2020, 15:42 »
а если сначала на бд потренироваться?
а потом бустовые индексы прикрутить.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Быстрая вставка
«
Ответ #5 :
Август 09, 2020, 09:12 »
Цитата: RedDog от Август 08, 2020, 15:42
а если сначала на бд потренироваться?
а потом бустовые индексы прикрутить.
Ну как-то оно смотрится "инородным телом", да и хлопот с "прикручиванием" немало. Кстати не знаю умеет ли БД такое делать
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Быстрая вставка
«
Ответ #6 :
Сентябрь 01, 2020, 14:55 »
Цитата: Авварон от Август 07, 2020, 13:00
Хорошая задачка на собеседование.
Интересно можно ли за 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
Сообщений: 3260
Re: Быстрая вставка
«
Ответ #7 :
Сентябрь 01, 2020, 15:17 »
Цитата: Racheengel от Сентябрь 01, 2020, 14:55
Принципиально отказываюсь от собеседований "с задачами", особенно с такой идеологией.
Как бы "шашечки или ехать"?
Если кандидат не в состоянии распознать и написать set_union/set_intersect, то зачем такой кандидат нужен? Я, собственно, люблю задачки которые в завуалированном виде мапятся на стандартный алгоритм - тогда даже не требуется реализовывать этот алгоритм, главное чтобы кандидат понял что это конкретный алгоритм, сумел преобразовать данные к виду в котором алгоритм применим, и применил его. Как follow up можно поговорить о том, как алгоритм устроен, в простых случаях (как этот) можно и попросить написать. Или уже параллельно пробежаться по двум массивам оказывается непосильной задачей?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Быстрая вставка
«
Ответ #8 :
Сентябрь 01, 2020, 18:30 »
Цитата: Racheengel от Сентябрь 01, 2020, 14:55
Цитата: Авварон от Август 07, 2020, 13:00
Хорошая задачка на собеседование.
Интересно можно ли за O(M+N) сделать?..
Принципиально отказываюсь от собеседований "с задачами", особенно с такой идеологией.
Как бы "шашечки или ехать"?
Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Быстрая вставка
«
Ответ #9 :
Сентябрь 01, 2020, 18:39 »
Цитата: Пантер от Сентябрь 01, 2020, 18:30
Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.
Вот потому ты и не в гугле=) Впрочем, я тоже
Ну а что спрашивать? Знает ли человек что такое деструкторы? Это хорошо если ты на конкретную вакансию идешь, гуглы же нанимают толкового чувака а та уже куда получится его приткнуть по навыкам. Поэтому и оценивается алгоритмический скилл не привязываясь к языку.
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Быстрая вставка
«
Ответ #10 :
Сентябрь 01, 2020, 19:10 »
Цитата: Авварон от Сентябрь 01, 2020, 18:39
Цитата: Пантер от Сентябрь 01, 2020, 18:30
Я тоже отказываюсь. Несколько собеседований у меня закончились толком не начавшись. Зато время сэкономил.
Вот потому ты и не в гугле=) Впрочем, я тоже
Ну а что спрашивать? Знает ли человек что такое деструкторы? Это хорошо если ты на конкретную вакансию идешь, гуглы же нанимают толкового чувака а та уже куда получится его приткнуть по навыкам. Поэтому и оценивается алгоритмический скилл не привязываясь к языку.
Это проблема гугла, не находишь?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Быстрая вставка
«
Ответ #11 :
Сентябрь 02, 2020, 11:53 »
Цитата: Авварон от Сентябрь 01, 2020, 15:17
...в простых случаях (как этот) можно и попросить написать. Или уже параллельно пробежаться по двум массивам оказывается непосильной задачей?
А как пробегаться? Напр исходный массив
Цитировать
Cube 1
...
И нужно вставить "Cube 10". Я обязан просматривать исходный массив пока не обнаружу "Cube >= 10" или до упора. Только после этого могу вставлять или реплейсить. И после первой же вставки номера строк изменятся, как-то сохранять их (для 2 и более вставляемых) не выходит
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Быстрая вставка
«
Ответ #12 :
Сентябрь 03, 2020, 09:18 »
Цитата: Авварон от Сентябрь 01, 2020, 15:17
Я, собственно, люблю задачки которые в завуалированном виде мапятся на стандартный алгоритм
Кстати здесь есть такая (или подобная) возможность. Как работает пресловутый O(log(N)): отрезок (контейнер) делится пополам, и, в зависимости от рез-та сравнения, операция повторяется с левой или правой частью.
Здесь прямолинейно использовать такое нельзя, мешает первый ключ. Но можно немного изменить стандартный алгоритм:
- делим отрезок пополам, если первый ключ "наш" ("Cube" в примере выше), то продолжаем как обычно. Иначе рекурсивно ищем в обеих частях. Правда нужно немного помозговать как сравнить рез-ты обеих частей - но это решаемо. Конечно эффективность будет не log(N), а меньше в зависимости от числа первых ключей. Но решение 100% "общее"
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Быстрая вставка
«
Ответ #13 :
Сентябрь 03, 2020, 11:01 »
Я же написал - предварительно отсортировать так что номера без номеров будут в конце. Тогда присвоить им уникальные номера - задача тривиальная.
Ну да, типа будет N*log(N) сортировка - надо быстрее - давайте обсудим.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Быстрая вставка
«
Ответ #14 :
Сентябрь 03, 2020, 11:42 »
Цитата: Авварон от Сентябрь 03, 2020, 11:01
Я же написал - предварительно отсортировать так что номера без номеров будут в конце. Тогда присвоить им уникальные номера - задача тривиальная.
Вставляемые "без номеров" - просто доп случай, это ничего не меняет
Цитата: Авварон от Сентябрь 03, 2020, 11:01
Ну да, типа будет N*log(N) сортировка - надо быстрее - давайте обсудим.
Как сделано сейчас: для каждого вставляемого (напр "Cube 10") просматривается весь массив до обнаружения "Cube >= 10", наилучшая позиция вставки запоминается. Напр нашли "Cube 5" в позиции (по-простому "в строке") 44, значит фиксируем: место вставки 44+1 = 45. Но еще не вставляем, ведь может найдется "Cube 7" и.т.п. Наконец весь массив просмотрен, вставляем в запомненное место, если оно -1 (вообще нет никаких "Cube"), то просто в конец.
Сейчас это вполне устраивает, необходимости выжимать скорость здесь нет. Но все-таки "перебор = визитная карточка лоха", интересно как без него. Не менее (а может и более) интересно как это сделать "технично", не размазывая текст на много страниц.
Записан
Страниц: [
1
]
2
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...