|
|
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКАmaxtrav, [src VB] Sub w140513_0845() Dim s1, s2, j1, j2 ''Выборка из миллиарда '' ''Условие задачи. '' ''Из числового интервала от единицы до миллиарда выбираются случайным образом без ''повторений миллион чисел и записываются в файл. ''Необходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле. ''Использовать массивы или иные структуры данных, их заменяющие, запрещается. а по вашему строка из кучи символов это не массив? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 09:24 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), нет, это файл на диске, согласно условию задачиавторповторений миллион чисел и записываются в файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 09:34 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКАkealon(Ruslan), нет, это файл на диске, согласно условию задачиавторповторений миллион чисел и записываются в файл. и вы его полностью в строку решили загрузить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 09:41 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Может я чего не понял, но по-моему все тривиально - объявляется интервал с нижней и верхней границей 1..1000000000. Потом идется по файлу. Если встреченное число рано нижней границе к нижней границе прибавляется 1 , если меньше верхней, верхняя равна встреченному числу. Если нижняя граница становится равна верхней, начинаем заново, но нижней границе+1, а верхнюю опять делаем опять 1000000000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:04 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ALOTE, а если-бы в задаче надо было найти две нижних "дырки" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:11 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Почитал топик, оказывается очень хорошая задачка ... чтобы проверить как разработчики умеют понимать ТЗ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:14 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
maytonALOTE, а если-бы в задаче надо было найти две нижних "дырки" ? То же самое, нижняя граница+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:22 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ALOTE, хех. Хвастун. А вот тебе еще мысль. Дана выборка из 2^32 - 1 уникальных элементов int. Я вот думаю как найти дырку без использования проверок условий "if-then-else". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:41 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ALOTEМожет я чего не понял, но по-моему все тривиально - объявляется интервал с нижней и верхней границей 1..1000000000. Потом идется по файлу. Если встреченное число рано нижней границе к нижней границе прибавляется 1 , если меньше верхней, верхняя равна встреченному числу. Если нижняя граница становится равна верхней, начинаем заново, но нижней границе+1, а верхнюю опять делаем опять 1000000000. и сколько раз придётся читать файл твоему алгоритму в худшем случае ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:46 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)и сколько раз придётся читать файл твоему алгоритму в худшем случае ? В худшем случае миллион раз, при условии, что случайная выборка даст отсортированный в обратном порядке массив чисел от 1 до 100000. Но при каждом проходе число читаемых строк будет уменьшаться на 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:51 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
maytonALOTE, хех. Хвастун. А вот тебе еще мысль. Дана выборка из 2^32 - 1 уникальных элементов int. Я вот думаю как найти дырку без использования проверок условий "if-then-else". Может вообще без программирования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:53 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
ALOTEkealon(Ruslan)и сколько раз придётся читать файл твоему алгоритму в худшем случае ? В худшем случае миллион раз, при условии, что случайная выборка даст отсортированный в обратном порядке массив чисел от 1 до 100000. Но при каждом проходе число читаемых строк будет уменьшаться на 1. посмотри мой алгоритм, c бинарным поиском, он делает это гарантированно за 20 проходов и ему неважно в каком порядке данные 10^6 < 2^20 PS: задача то олимпиадная, проверка на входе будет подсовывать самые неудобные случаи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 12:59 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
maytonALOTE, хех. Хвастун. А вот тебе еще мысль. Дана выборка из 2^32 - 1 уникальных элементов int. Я вот думаю как найти дырку без использования проверок условий "if-then-else". :-) а сколько чисел в выборке, всего одно выпало? а While использовать можно? если всего одно число сумма всех чисел от 1 до N = (1+N)*N/2 вычитаем из него все числа в файле итоговым результатом будет невключённое число ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 13:06 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Может XOR-ем попробовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 15:02 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Поделим миллиардный интервал на два интервала по 500 миллионов. Где может находиться искомое число? Очевидно, в первом, так как 500-миллионный интервал миллионом чисел не заполнить. Теперь поделим первый 500-миллионный интервал на два и т. д. Рано или поздно заключение о том, что интервал, содержащий искомое число, будет первым, окажется несправедливым. Поэтому давайте для любой пары интервалов разработаем более универсальный метод. Почему очевидно в первом ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 15:26 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПоделим миллиардный интервал на два интервала по 500 миллионов. Где может находиться искомое число? Очевидно, в первом, так как 500-миллионный интервал миллионом чисел не заполнить. Теперь поделим первый 500-миллионный интервал на два и т. д. Рано или поздно заключение о том, что интервал, содержащий искомое число, будет первым, окажется несправедливым. Поэтому давайте для любой пары интервалов разработаем более универсальный метод. Почему очевидно в первом ? как уже говорил... автор предоставил избыточное решение (делается больше чем надо). Очевидно, что пропуск находится в одной из первых 1000001 позиций. А значит и 1000 000 000 проверять не надо... достаточно начинать делить интервалы начиная с миллиона (точнее начиная с 0xFFFFF = 1048576, тогда все операции легко сводятся к битовым, а потому идёт экономия времени и упрощение логики). Код: pascal 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. Вот так :) Вот моё решение, на основании решения автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 17:08 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Ох уж эти любители Паскаля... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 18:56 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
[quot Програмёр]SashaMercuryпропущено... Вот так :) Вот моё решение, на основании решения автора. Не работает ваше решение, я его немного модифицировал без потери смысла Код: pascal 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. выводит 16, хотя должно быть 11 кроме того оно выходит считает файл 32 раза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 19:23 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
[quot kealon(Ruslan)]Програмёрпропущено... Не работает ваше решение, я его немного модифицировал без потери смысла Код: pascal 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. выводит 16, хотя должно быть 11 кроме того оно выходит считает файл 32 раза Сильно извиняюсь :) реально ошибся... в последний момент перед заливкой поправил и не проверил. В условии увеличения счётчика ошибся... вот код с правильным накладыванием маски: Код: pascal 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. файл читается 20 раз... Ровно столько раз, сколько бит в самом большом числе искомого интервала (в нашем случае это 1000001 < 2^20). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 22:26 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Ребята, вы издеваетесь ? Я уже единственное нормальное, и с большой долей вероятности самое быстрое решение привёл вышел. такая постановка решается очень просто :), код примерно такой: SS Код: plaintext 1. 2. 3. 4. 5. 6. 7. если индексы не напутал, но смысл думаю понятен :) Програмёркак уже говорил... автор предоставил избыточное решение (делается больше чем надо). Очевидно, что пропуск находится в одной из первых 1000001 позиций. А значит и 1000 000 000 проверять не надо... достаточно начинать делить интервалы начиная с миллиона (точнее начиная с 0xFFFFF = 1048576, тогда все операции легко сводятся к битовым, а потому идёт экономия времени и упрощение логики). автор предоставил порнографическую постановку задачи, и аналогичное решение задачи. Удивлён что mayton участвовал в этой вашей дискуссии. Хотя, судя по тому как он тонко намекнул остальным на XOR.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 01:50 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
пИз числового интервала от единицы до миллиарда выбираются случайным образом без повторений миллион чисел и записываются в файл. Необходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле. Использовать массивы или иные структуры данных, их заменяющие, запрещается. ну очевидно что в полученном массиве будет 10^6 чисел, и зачем мне смотреть те индексы что даже не существуют ???? И поэтому вашу фразу ПрограмёрОчевидно, что пропуск находится в одной из первых 1000001 позиций. я понимаю как -очевидно что искомое число имеет значение в диапазоне 1 - 10^6+1. Вот как я вижу эту задачу: 1. Дан массив array мощностью 10^6. Каждый элемент массива целое число в диапазоне от 1 до 10^9. Каждый элемент массива уникален. Найти минимальное пропущенное число в array. К этой задаче решение выше не подходит. Вот, как мне кажется, вы видите эту задачу. 2. Дан массив array мощностью 10^6. Каждый элемент массива целое число в диапазоне от 1 до 10^6. Каждый элемент массива уникален. Найти минимальное пропущенное число в array. К этой задаче решение выше. Допустим, мы рассматриваем задачу 1. Програмёркак уже говорил... автор предоставил избыточное решение (делается больше чем надо). Очевидно, что пропуск находится в одной из первых 1000001 позиций Возможно, вы хотите сказать что значение искомого числа в диапазоне 1 - 10^6+1, но и это неверно. Допустим все array[i]=0.5^10^9+i. Тогда минимальное пропущенное 0.5^10^9-1 Значит, вы возможно рассматриваете такую постановку: 3. Дан массив array мощностью 10^6. Каждый элемент массива целое число в диапазоне от 1 до 10^9. Каждый элемент массива уникален. Найти минимальное не включенное в array число из диапазона 1 - 10^9. И тогда, ДЕЙСТВИТЕЛЬНО, наше число находится в диапазоне 1 - 10^6+1. Вы рассматриваете задачу 3 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 03:00 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
SashaMercuryРебята, вы издеваетесь ? Я уже единственное нормальное, и с большой долей вероятности самое быстрое решение привёл вышел. такая постановка решается очень просто :), код примерно такой: SS Код: plaintext 1. 2. 3. 4. 5. 6. 7. если индексы не напутал, но смысл думаю понятен :) Програмёркак уже говорил... автор предоставил избыточное решение (делается больше чем надо). Очевидно, что пропуск находится в одной из первых 1000001 позиций. А значит и 1000 000 000 проверять не надо... достаточно начинать делить интервалы начиная с миллиона (точнее начиная с 0xFFFFF = 1048576, тогда все операции легко сводятся к битовым, а потому идёт экономия времени и упрощение логики). автор предоставил порнографическую постановку задачи, и аналогичное решение задачи. Удивлён что mayton участвовал в этой вашей дискуссии. Хотя, судя по тому как он тонко намекнул остальным на XOR.. Да, просто я когба подбирал аналогичную задачу, забыл о более оптимальном поиске одного пропуска. Потому задачу лучше свести к 2 пропускам, и она станет аналогичной изначальной задаче, только без излишеств. То есть, есть 1000000 чисел в диапазоне 1000002. Найти меньшее из пропущеных чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 07:28 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Тогда мы имеем поиск неподвижной точки. Не стал разбираться как сделано у автора по ссылке в первой записи топа(ибо его объяснение мне мягко говоря не нравится), но судя по вашим комментариям у вас что-то аналогичное с алгоритмом ниже. Код в первом приближении Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 08:47 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
Если не ошибаюсь, количество проходов log_2 (1 000 000). То есть не должно превышать 20, тоже встречал это число. Так как это частный случай, то всё равно эту задачу можно решить за один проход. Только надо подумать как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 08:53 |
|
||
|
Выборка из миллиарда
|
|||
|---|---|---|---|
|
#18+
SashaMercuryРебята, вы издеваетесь ? Я уже единственное нормальное, и с большой долей вероятности самое быстрое решение привёл вышел. такая постановка решается очень просто :), код примерно такой: SS Код: plaintext 1. 2. 3. 4. 5. 6. 7. если индексы не напутал, но смысл думаю понятен :) Програмёркак уже говорил... автор предоставил избыточное решение (делается больше чем надо). Очевидно, что пропуск находится в одной из первых 1000001 позиций. А значит и 1000 000 000 проверять не надо... достаточно начинать делить интервалы начиная с миллиона (точнее начиная с 0xFFFFF = 1048576, тогда все операции легко сводятся к битовым, а потому идёт экономия времени и упрощение логики). автор предоставил порнографическую постановку задачи, и аналогичное решение задачи. Удивлён что mayton участвовал в этой вашей дискуссии. Хотя, судя по тому как он тонко намекнул остальным на XOR.. код на коленке можно приводить любой рабочей проги, которую можно проверить нету вот например, при чём здесь последняя i (...^i) ? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 09:24 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38640513&tid=1341363]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
342ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 696ms |

| 0 / 0 |
