|
|
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Приветствую всех знатоков :) Недавно увидел непростую задачу, знаний на которую пока что не хватает для решения. Сама задача: есть дорога, на которой стоит N заправок. Также известно расстоянием между заправками. Данные представлены в табличке с двумя колонками, где в первой - простая нумерация заправок от 1 до N, а во второй - расстояние до заправки (считать, что для первой заправки расстояние считается от начала отправления пользователя, например - из дома) Пример: 1 10 2 10 3 30 Нужно расположить на искомом отрезке L новых заправок так, чтобы минимизировать максимальное расстояние между соседними заправками. (например, на вышеупомянутом наборе данных, при количестве новых заправок L = 1 нужно поставить новую заправку ровно посередине дороги между 2ой и 3ей заправкой, а при количестве L = 2 новых заправок нужно поставить между 2ой и 3ей заправкой на расстоянии 1/3 и 2/3, то есть чтобы расстояние разбилось на три десятки, так как данное решение минимизирует максимальное расстояние между любыми соседними заправками) P.S. интересует решение без использования model, рекурсий, циклов, а также pl/sql, так как требованием было не использовать ранее сказанное, а также был дан намёк в сторону спецификации типов данных oracle. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:14 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666, У меня даже Яреклама выдаёт Тинькова в этой теме. В разделе "работа" уже разбирали эту задачу, но только через циклы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:24 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Dshedoo, К гадалке не ходи: в связи с ростом цен на бензин, Олег решил перейти с банковского бизнеса на розничную торговлю ГСМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:30 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Dshedoo, как раз такие там и увидел данную задачу, но не увидел ни одного нормального алгоритма/решения. А ещё хотелось бы с теми ограничениями, что я написал, узнать, есть ли решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 14:26 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666есть ли решение.Если количество новоколонок меньше суммы целоотношений ненулевых расстояний, то решается в один проход. Иначе, решается перебором подмножеств количеством добавляемых колонок с выбором первого (минимального) макс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:10 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Можно попробовать симплекс-метод или ОПГ, мб проканает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:21 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Пример: 1 10 2 10 3 30Если заправки находятся на одном отрезке, то непонятен смысл указывать те, что попадают в одну точку. Вторая заправка убирается группировкой, что никоим образом не влияет не итоговое решение. KDA_666Нужно расположить на искомом отрезке L новых заправок так, чтобы минимизировать максимальное расстояние между соседними заправками. (например, на вышеупомянутом наборе данных, при количестве новых заправок L = 1 нужно поставить новую заправку ровно посередине дороги между 2ой и 3ей заправкой, а при количестве L = 2 новых заправок нужно поставить между 2ой и 3ей заправкой на расстоянии 1/3 и 2/3, то есть чтобы расстояние разбилось на три десятки, так как данное решение минимизирует максимальное расстояние между любыми соседними заправками) Если разположить две новых между 2 и 3, то дистанции будут 10, 6.66, 6.66, 6.66. Если расположить одну между пользователем и 1/2, а вторую между 1/2 и 3, то дистанции будут 5, 5, 10, 10. Максимальное в обоих случаях 10. Отсюда вопрос почему нужно , а не можно . Алгоритм Сначала выполняется сорировка по расстоянию от текущей до предыдущей. На каждой итерации идем по увеличению расстояний, если расстояние между выделенными заправками на текущем участке равно максимальному, то добавляем новую на текущий участок. tmp_allocated использовано, так как после выделения изменится значение аграгатов для других строк на текущей итерации, а этого надо избежать. Поэтому max считаем по allocated, а не tmp_allocated. after_allocation, max_after_allocation - просто для информации, их можно убрать. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Неитеративно решается только при определенных ограничениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:44 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, и вы предоставите(напишите) этот код на листочке во время собеседования ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:50 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Мои вопросы отпали. В условии сразу указывается расстояние между соседними, а не до исходной точки. Тогда не нужен подзапрос с lag. Алгоритм для модели не меняется. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:59 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, KDA_666 интересует решение без использования model ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:01 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
123йй, При наличии доступа к компу времени надо не так уж и много - примерно полчаса. Но давать такое на собесед это неадекватно, имхо. Возможно, просто предполагался разговор о направлении решения и про специфические случаи. merch, Каюсь, в общем случае пока затрудняюсь решить неитеративно. Даже мышление в сторону "спецификации типов данных oracle" не помогает. Может это просто вброс ТС или собеседователей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:12 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, Спасибо за ответ) Забыл в предложении "Данные представлены в табличке с двумя колонками, где в первой - простая нумерация заправок от 1 до N, а во второй - расстояние до заправки" явно указать "расстояние до СЛЕДУЮЩЕЙ заправки от предыдущей точки", что вносит дополнительное пояснение. Покапавшись в некоторых решениях и типах наткнулся на коллекции, с помощью которых можно решить данную задачу, не используя то, что я говорил в ограничениях (по типу model), но ни разу не работал с данным типом. Хотя основное направление я уже понял, был бы не против, если кто мог бы показать, как это примерно делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:16 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Покапавшись в некоторых решениях и типах наткнулся на коллекции, с помощью которых можно решить данную задачу, не используя то, что я говорил в ограничениях (по типу model)Слишком унылый вброс который лишь демонстрирует полное непонимание вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:45 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Приветствую всех знатоков :) P.S. интересует решение без использования model, рекурсий, циклов, а также pl/sql, так как требованием было не использовать ранее сказанное Странное ограничение. Отказавшись от использования самых подходящих инструментов вы получаете неэффективное решение. Это так работают в Тинькове? С этими ограничениями задачка превращается в головоломку. Впрочем - несложную, минут на 15 ( признаюсь честно, синтаксис модели я бы дольше вспоминал-гуглил, уж очень редко использую). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. При &num_stations = 12: Заправка Расстояние3 104 8.3333333334 16.666666674 254 33.333333334 41.666666674 504 58.333333334 66.666666674 754 83.333333334 91.66666667 Если собеседующий скажет, что connect by level - это та же рекурсия, обойдитесь старым добрым джойном к select * from dba_objects. Решение, очевидно не самое эффективное - его сложность равна N * K * log(n*k) где N - количество заправок существующих, K - количество заправок которых надо добавить, но если и тех и тех не многие тысячи вполне рабочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 01:01 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradПри &num_stations = 12При 13 и 14 макс расстояние остается 10 (между 1 и 2 ноль новых, между 2 и 3 - одна). При 15 расстояние между 1 и 2 по прежнему остается 10... при 20 по прежнему ничего между 1 и 2 не вставлено => max = 10. Если я правильно понимаю результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:19 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегValergradПри &num_stations = 12При 13 и 14 макс расстояние остается 10 (между 1 и 2 ноль новых, между 2 и 3 - одна). При 15 расстояние между 1 и 2 по прежнему остается 10... при 20 по прежнему ничего между 1 и 2 не вставлено => max = 10. Если я правильно понимаю результат. Это была опечатка для проверки бдительности)). Нужно в одном месте не i+1, а i конечно же) авторThere are two hard things in computer science: 0) Cache invalidation 1) Naming things 2) Off-by-one errors Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Теперь для 15 результат: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:38 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
123ййКобанчег, и вы предоставите(напишите) этот код на листочке во время собеседования ? Я видел людей, которые могли это сделать. Несколько человек. Может быть именно их и ищут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:41 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
982183, Люди бывают разные. Раньше считалось нормой на asm писать на листочке. Но на собеседовании кодировать от получаса это перебор. Тут с согласен с Кобанчег 21704375 скорее это была теория и понять ход мысли ТС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 08:54 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Я к тому, что есть действительно уникумы, достаточно сложно тестируемые на обычных задачах. И если стоит задача найти именно таких. то выбор задания вполне обоснован. Хотя, несомненно, для общей массы сложность слишком нестандартно. Да и провернуть/проверить логику без теста на компе сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 10:07 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
О чем вы, ребята? О каких уникумах? Задачка очень простая же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 12:24 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Valergrad, Изящно. Я вчера тоже стал думать в этом направлении, начал с вопроса: "сколько станций должно быть добавлено до первой станции на самом коротком отрезке (4)", но итоговую формулу для порядка выводить было лень. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:19 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, А обратно отрезки в заправки развернуть?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:28 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, Опять бензина с утра нюхнул? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:44 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Valergrad, Спасибо за ответ, очень помогло! Кобанчег, Вовсе не вброс. Я, конечно, новичок в данной теме и может не так выразил свою мысль, но чуть позже предоставлю своё решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 14:02 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
авторДанные представлены в табличке с двумя колонками, где в первой - простая нумерация заправок от 1 до N, а во второй - расстояние до заправки (считать, что для первой заправки расстояние считается от начала отправления пользователя, например - из дома) Выбирать точку отсчета начала маршрута непонятно где для решения задачи неудобно и ни на что не влияет, поэтому на первом шаге имеет смысл сделать первую заправку точкой отсчета, соответственно точка отправления пользователя уйдет в минус на координатной оси, куда ей и дорога. Второй момент, если есть или получаются одинаковые расстояния между заправками, куда помещать новую заправку? Этот момент необходимо конкретизировать для получения детерменированного решения задачи. Добавляем условие, если есть несколько отрезков (расстояний между соседними заправками) одинаковой величины, то новая заправка помещается на максимально удаленном от первой заправки отрезке. Сделаем тестовый пример: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Результат добавления L новых заправок представить в виде таблицы, содержащей столбцы - номер заправки, расстояние до первой заправки, расстояние до предыдущей заправки, номера заправок должны быть последовательные и следовать в порядке увеличения расстояния от первой заправки. В таком виде задача приобретает более осмысленный вид и пригодна для решения, дерзайте)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 22:47 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorВ таком виде задача приобретает более осмысленный вид и пригодна для решения, дерзайте))Нужно быть очень неордиарной личонстью, чтоб после уточненных условий и предоставленных решений написать этот поток сознания да еще с таким апломбом. Есть вполне конкретные входные данные и четкий критерий минимизации. Если что-то непонятно - лучше просто уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 22:58 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradО чем вы, ребята? О каких уникумах? Задачка очень простая же. Речь не о сложности самого алгоритма, а о способности человека записать программный код "на бумажке". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 02:10 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
982183Речь не о сложности самого алгоритма, а о способности человека записать программный код "на бумажке". Может быть речь шла как раз о путях решения, сомнительно чтобы на собеседовании требовалось решить итерационную задачку на SQL, на процедурном языке нужны всего навсего массив и три цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 12:29 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
982183о способности человека записать программный код "на бумажке".Когда-то проще было написать на бумажке, чем сразу нащелкивать тумблерами адрес и значение, а потом гадать, что получилось. Правда язык машинных кодов, в отличие от всяких наворотов над ним, прост для понимания. Даже тупые машины могут его исполнять без дополнительных манипуляций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 12:38 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Одно дело описать алгоритм на бумажке, другое дело код, зачем подобную кракозябру писать на бумажке? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 14:38 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Третий цикл даже лишний и сортировка исходных данных по расстоянию не нужна, сбили любители select-ов с их "бесплатной" сортировкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 14:50 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 15:06 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 15:20 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
123йй, 18с)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2018, 15:28 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorВторой момент, если есть или получаются одинаковые расстояния между заправками, куда помещать новую заправку? Этот момент необходимо конкретизировать для получения детерменированного решения задачи. Добавляем условие, если есть несколько отрезков (расстояний между соседними заправками) одинаковой величины, то новая заправка помещается на максимально удаленном от первой заправки отрезке. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2018, 00:28 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за обсуждение данной задачи. Подкину ещё один способ решения: довольно таки затратный, неоптимизированный и т.д., но делает то, что нужно. Такое на бумажке не напишешь, конечно же, поэтому решение от Valergrad считаю оптимальным, при тех условиях, что я писал в начале темы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2018, 16:30 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666делает то, что нужноОно даже приблизительно не делает то, что нужно. Попытка использовать powermultiset_by_cardinality для генерации возможных распределений изначально неудачна, т.к. число добавленных заправок не обязано быть уникальным по участкам. Если делать полный перебор есть намного более вменяемые способы в SQL. Чтоб убедиться в нерабочести достаточно заменить 60 на 600, тогда все добавленные должны пойти на последний участок а на остальных участках будет по нулям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2018, 18:19 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кто способен изобразить на листочке? Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. Еще остался простор для оптимизации поиска максимального расстояния между заправками ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2018, 14:40 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorКто способен изобразить на листочке? А что здесь сложного? Кроме излишней многословности не вижу ничего такого - но я не вчитывался. Можно узнать, чем этот фрагмент лучше лаконичного sql? Может быть он быстрее? И еще у меня в памяти запомнилось, что вы говорили в исходном комменте о том, что задачу нельзя решать c помощью pl/sql, среди других ограничений. Именно такое было условие на собеседовании, если я вас правильно понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2018, 21:36 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradА что здесь сложного? Абсолютно ничего, если не рисовать это на листочке. Valergradчем этот фрагмент лучше лаконичного sql? Может быть он быстрее? Итерационная задача оптимальным образом может быть решена с помощью соответствующих инструментов и SQL это не совсем подходящий инструмент, хотя если просто побаловаться или получить быстро и разово результат на небольшой выборке, то и SQL сойдет. По скорости нужно сравнивать, как правило процедурное решение работает на порядок, а то и на два быстрее. ValergradИ еще у меня в памяти запомнилось, что вы говорили в исходном комменте о том, что задачу нельзя решать c помощью pl/sql, среди других ограничений. Именно такое было условие на собеседовании, если я вас правильно понял. Подвела тебя память, я не автор темы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2018, 22:49 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorValergradА что здесь сложного? По скорости нужно сравнивать, как правило процедурное решение работает на порядок, а то и на два быстрее. Здесь не соглашусь. Дело не в процедурности-непроцедурности, а в алгоритме. Как я и написал, у моего запроса сложность - o(N*K*log(n*k)). У вашего, соответственно - o(N*K) ( в худшем случае, в среднем зависит от распределения данных). На малых значениях еще важна константа, которая для sql-решения будет, конечно, меньше за счет нативности операций и отсутсвия переключений контекста. Поэтому сравнение запроса и кода на случайных данных показывает что 1) пока N и K до 1000 - запрос работает быстрее. 2) Далее, запрос начинает отставать , но зато его легко убыстрить, добавив просто хинт /*+ PARALLEL(n) */ - что дает запросу возможность работать быстрее еще до 5-10 тысяч N и K. В процедуру вы параллелизацию так просто не прикрутите - придется ее перерабатывать. 3) И только после 10 тысяч процедура начинает работать быстрее - за счет лучшей сложности алгоритма. Впрочем, эта сложность не наилучшая. Скажем, есть несложное решение ( использующее как раз структуры данных ) у которого сложность алгоритма будет o( log(n) * k). Сможете найти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 02:55 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, Если представить, что задача была дана до интервью как тестовая, то возникает вопрос: что для кандидата хуже : не прислать ничего или прислать твой бред. К сожалению, прислать бред все же хуже, т.к. ничего не прислав можно будет попробовать на открывшуюся позицию через некоторый срок. А если кандидат прислал такое, то его вряд ли рассмотрят и через год и через два. Потому что ясность мышления приобретается заметно сложнее чем знания по продукту. Если у кандидата каша в голове то какая разница, пусть он знает хоть все доки наизусть. Теперь посмотрим, так ли монструозно выглядит остальное. Пусть было n заправок, надо добавить k. Вычислительная сложность первой модели O(k*n*n): k итераций, на каждой проходим n строк, для каждой строки считаем агрегат(ы). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Вычислительная сложность варианта Valergrad O((n*k)log(n*k)): По сути требуется сортировка набора размером n*k. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Если больше подумать над моделью то можно додуматься что на каждой итераци можно считать индекс для обновления на следующей итерации - r. Вычислительная сложность O((k*(n*log(n))): Выполняем k итераций, на кадой сортируем набор размером n. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Очень много текста? Это НЕ подходящая задача для интервью, но адекватное тестовое задание, если требуется проверить алгоритмическую смекалку (для SQL разработчика ). В силу специфики SQL движка, и особенно модели, накладные расходы могут достаточно сильно искажать картину. В частности, вариант Valergrad скоее всего будет быстрее даже улучшенной модели не смотря на его большую вычислительную сложность. На PL/SQL можно решить заметно эффективнее и без простыни говно-кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 02:56 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Valergrad...На минуту опередил! Зря я так расписывал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 03:00 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчегдля SQL разработчика Это кто такие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 07:46 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегValergrad...На минуту опередил! Зря я так расписывал... Сорри... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 11:49 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегНа PL/SQL можно решить заметно эффективнее и без простыни говно-кода. Как-то сурово. Код как код, видал я ( и вижу на работе регулярно у коллег ) и похуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 12:01 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ElicКобанчегдля SQL разработчика Это кто такие?Разработчику Оракла зачастую более важно уметь выражать мысли декларативно на SQL чем быть искусным в алгоритмах. С другой стороны, задача могла бы быть уместной на собеседовании C++/Java. Хотя никто доподлинно не может сказать на какую позицию была эта задача и была ли вообще. ValergradКак-то сурово. Код как код, видал я ( и вижу на работе регулярно у коллег ) и похуже.Ну раз тех коллег кто-то нанимает и никто не увольняет, то и SkilledJunior не пропадет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 12:20 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегНу раз тех коллег кто-то нанимает и никто не увольняет, то и SkilledJunior не пропадет. А у вас таких нет? Что за компания, я тогда к вам пойду))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2018, 12:49 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradЗдесь не соглашусь. А не надо соглашаться или не соглашаться, тесты нужно написать и выполнить в одинаковых условиях, тогда будет более менее реальная картина. ValergradНа малых значениях еще важна константа, которая для sql-решения будет, конечно, меньше за счет нативности операций и отсутсвия переключений контекста. Ты уверен что PL/SQL не нативный? Что касается переключения контекста, и накладных расходов, с этой точки зрения такой запрос: select my_st_all_typ(num_station, dist_to_prev, 0, dist_to_prev) это опа. Зачем я так сделал? Чтобы продемонстрировать табличные функции разных типов и поленился немного, конечно нужно было считывать исходные данные в коллекцию записей а не объектов, считывая в коллекцию объектов приходится дергать конструктор объекта, т.е. дергать функцию на каждую строку, в реальной системе так делать конечно не стоит. ValergradВпрочем, эта сложность не наилучшая. Скажем, есть несложное решение ( использующее как раз структуры данных ) у которого сложность алгоритма будет o( log(n) * k). Сможете найти? Слабое место это поиск максимального расстояния на каждой итерации, я прохожу в лоб циклом перебирая N строк, можно пытаться строить индекс и пользоваться индексом, но есть большое но, индекс очень быстро теряет свою селективность по максимальному значению и начинает стремиться к полному перебору, т.е. индекс нужно периодически полностью перестраивать, делать это на каждой итерации еще хуже чем простой перебор. Поэтому я надеюсь ты не хотел предложить ассоциативный массив с неуправляемой тобой индексацией и не совсем подходящим типом данных индекса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 00:00 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегSkilledJunior, Если представить, что задача была дана до интервью как тестовая, то возникает вопрос: что для кандидата хуже : не прислать ничего или прислать твой бред. К сожалению, прислать бред все же хуже, т.к. ничего не прислав можно будет попробовать на открывшуюся позицию через некоторый срок. А если кандидат прислал такое, то его вряд ли рассмотрят и через год и через два. Какое громкое заявление, давай свой изящный и эффективный процедурный говнокод код или для тебя код на PL/SQL по умолчанию является говнокодом? Кстати не забывай, что ваше решение недетерминированное, т.е. если есть одинаковые отрезки, то новая заправка будет попадать в них в зависимости от того как фишка ляжет, у меня решение детерминированное, заправка всегда добавляется на самый удаленный отрезок. КобанчегПотому что ясность мышления приобретается заметно сложнее чем знания по продукту. Если у кандидата каша в голове то какая разница, пусть он знает хоть все доки наизусть. Тебе еще работать и работать над приобретением ясности мышления)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 00:13 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегВыполняем k итераций, на кадой сортируем набор размером n. Ты считаешь что сортировка n-записей дешевле однократного прямого прохода по n-записям для поиска максимального значения? Ты случаем не из параллельной вселенной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 00:20 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorКстати не забывай, что ваше решение недетерминированноеРешение недетерминироавнное у Valergrad. Детерминированность приобретается, если добвить еще одно поле в order by. Модели обе детерминированнве некуда. Единственное что, последнюю можно чуть упростить и обойтись first_value/last_value вместо трюкачества с keep. SkilledJuniorТы считаешь что сортировка n-записей дешевле однократного прямого прохода по n-записям для поиска максимального значения?Нет, это ты счтаешь, что я считаю. Из параллельной реальности это тот кто сам себе задачу поставил - сам спамит на форум свои шЫдевры и думает что с ним кто-то соревнуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 01:11 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Понятно, значит эталонного процедурного исполнения от Кабанчега мы не увидим, чего и следовало ожидать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 01:14 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorв зависимости от того как фишка ляжетВ бизнесе это нормальная практика, бросать монетку при прочих равных. Способствует конкуренции. Да и концепция реляционных множеств не накладывает обязательности сортировки яиц в корзине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 08:29 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorно есть большое но, индекс очень быстро теряет свою селективность по максимальному значению и начинает стремиться к полному перебору, т.е. индекс нужно периодически полностью перестраивать Здесь вы ошиблись - для нахождения максимального значения селективность индекса не влияет, оно всегда находится за высоту индекса. Впрочем, решение с индексом все равно плохое т.к. накладные расходы на dml-операции съедят все. Я имел ввиду думать именно в сторону алгоритмических структур данных, реализованных на pl/sql, среди них есть множество структур данных поддерживающих апдейт значения и поиск максимума на отрезке одновременно за o(log n). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 13:00 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Valergradдля нахождения максимального значения селективность индекса не влияет, оно всегда находится за высоту индекса.В целом это не совсем так: RS с левой открытой границей читает пустые блоки индекса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 13:43 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ElicValergradдля нахождения максимального значения селективность индекса не влияет, оно всегда находится за высоту индекса.В целом это не совсем так: RS с левой открытой границей читает пустые блоки индекса Это, конечно, интересно, но в нашем случае блоки же не будут пустые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:20 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradElicпропущено... В целом это не совсем так: RS с левой открытой границей читает пустые блоки индекса Это, конечно, интересно, но в нашем случае блоки же не будут пустые? Хотя если речь о моем утверждении "оно всегда находится за высоту индекса. " - согласен, был неправ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:21 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradЗдесь вы ошиблись - для нахождения максимального значения селективность индекса не влияет, оно всегда находится за высоту индекса. Впрочем, решение с индексом все равно плохое т.к. накладные расходы на dml-операции съедят все. Какие такие dml-операции, дергать dml в функции на каждую итерацию это кирдык производительности сразу, нее только ручками, только хардкор. А ручками мы можем строить либо упрощенный вариант без сортировки внутри листьев, что быстро, но селективности не будет, либо с сортировкой внутри листьев, только подумайте что делать, если значение попадает куда то в начало блока, чтобы сохранить сортировку придется сдвинуть все значения в этом листе, как ни крути очень накладные операции и дадут ли они существенный прирост производительности большой вопрос. Кроме того изменение данных таково, что верхняя граница постоянно уменьшается и данные упаковываются в меньший диапазон, т.е. если мы построили индекс от минимального до максимального значения с равномерной разбивкой на диапазоны значений, через небольшое количество итераций все данные окажутся в одном-двух листьевых блоках. Если листы не имеют внутренней сортировки получаем то от чего хотели уйти, полный перебор, если листы содержат отсортированный набор имеем перестройку сортировки при добавлении нового/удалении старого значения. Можно посмотреть на тестовом примере: Код: plsql 1. NUM_STATIONDIST_TO_PREVALLOCATEDNEW_DIST23033505480852026707760681001091701710160161136036 диапазон 2-36 Код: plsql 1. NUM_STATIONDIST_TO_PREVALLOCATEDNEW_DIST23033512.54822.6666666666666666666666666666666666666752026722.33333333333333333333333333333333333333761381032.591752.83333333333333333333333333333333333333101652.666666666666666666666666666666666666671136113 всего тридцать заправок и диапазон уже 2-3 Код: plsql 1. NUM_STATIONDIST_TO_PREVALLOCATEDNEW_DIST2321354148715211676176518109191716110161511136351 Совпало так совпало))) 100 заправок и диапазон 1-1 ValergradЯ имел ввиду думать именно в сторону алгоритмических структур данных, реализованных на pl/sql, среди них есть множество структур данных поддерживающих апдейт значения и поиск максимума на отрезке одновременно за o(log n). Пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:04 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorА ручками мы можем строить либо упрощенный вариант без сортировки внутри листьев, что быстро, но селективности не будет, либо с сортировкой внутри листьев, только подумайте что делать, если значение попадает куда то в начало блока, чтобы сохранить сортировку придется сдвинуть все значения в этом листе, как ни крути очень накладные операции и дадут ли они существенный прирост производительности большой вопрос. Вы судя по всему не знакомы со стандартными структурами данных, поэтому у вас так мало вариантов. На самом деле их, конечно, больше. SkilledJuniorValergradЯ имел ввиду думать именно в сторону алгоритмических структур данных, реализованных на pl/sql, среди них есть множество структур данных поддерживающих апдейт значения и поиск максимума на отрезке одновременно за o(log n). Пример? Как пример ( я не говорю что это самая подходящая для данной задачи структура ) - https://ru.wikipedia.org/wiki/Красно-чёрное_дерево ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:51 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradВы судя по всему не знакомы со стандартными структурами данных, поэтому у вас так мало вариантов. На самом деле их, конечно, больше. Ты прав, нужно расширять кругозор. ValergradКак пример ( я не говорю что это самая подходящая для данной задачи структура ) - https://ru.wikipedia.org/wiki/Красно-чёрное_дерево Спасибо за ссылку, но хотелось бы: Valergradреализованных на pl/sql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 22:55 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Как обосновать, что ответ Кобанчег Код: plsql 1. 2. 3. 4. 5. 6. лучше, чем например: Код: plsql 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 10:37 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Est_voprosлучше, чемПо критерию max результат равнозначный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 11:32 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
-2-По критерию max результат равнозначный. А как это реализовать на SQL? Если так: Вычислить расстояния на отрезках. Определить среднее. просуммировать отклонения расстояний от средних, умноженные на кол-во отрезков То решение Кобанчег Код: plsql 1. 2. 3. 4. 5. 6. хуже, чем Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. SUM_DELTA_AVG_KOL41.8333333333333 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. SUM_DELTA_AVG_KOL12.8333333333333 Кобанчег, парируйте! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 12:56 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1883283]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
171ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
94ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 508ms |

| 0 / 0 |
