powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выборка из миллиарда
25 сообщений из 88, страница 1 из 4
Выборка из миллиарда
    #38639090
maxtrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попалась задачка. Есть ее решение. Но не могу понять хоть убей, как ее решает автор. Пожалуйста помогите. Растолкуйте решение.
http://www.lotos-khv.narod.ru/dist/lek6.htm
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639122
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ее автор - хабаровская "школа программистов". Она и должна растолковывать и пояснять
потоки своего сознания. При чём здесь sql.ru - непонятно.

P.S. Просто мнение....
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639163
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Высосали проблему из пальца.
При известной нижней границе "наименьшее отсутствующее" или "ничего" или "нижняя граница".
Соответственно, требуется проверить, есть ли в выборке число, равное нижней границе. Один проход.
Даже если переформулировать идиотскую формулировку - всё равно один проход. Без всяких сортировок.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639167
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПри известной нижней границе "наименьшее отсутствующее" или "ничего" или "нижняя граница".Это почему же?
Вполне может быть, что "нижняя граница" занята, а "наименьшее отсутствующее" где-то больше.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639176
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВполне может быть, что "нижняя граница" занята, а "наименьшее отсутствующее" где-то больше.Да, в этой формулировке больше похоже на правду, но это всё равно один проход.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639177
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovДа, в этой формулировке больше похоже на правду, но это всё равно один проход.Два. Первый на поиск наименьшего, второй - на поиск дырки.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639178
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmiksoftВполне может быть, что "нижняя граница" занята, а "наименьшее отсутствующее" где-то больше.Да, в этой формулировке больше похоже на правду, но это всё равно один проход.Числа не отсортированы. Как?
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639181
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЧисла не отсортированы. Как?Как искать наименьшее в один проход?
Сравнивать очередного кандидата с уже найденным претендентом.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639182
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача ниочем
авторИз числового интервала от единицы до миллиарда выбираются случайным образом без повторений миллион чисел и записываются в файл. Необходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле. Использовать массивы или иные структуры данных, их заменяющие, запрещается.
Там в решении предлагается сначала отсортировать, затем искать дырки между соседними. Алгоритмы сортировки в куче источников описаны.

Только наполнение 0,1% (миллион из миллиарда), т.е. вероятность 1000 к 1 что нет первого, поэтому можно тупо перебирать 1,2,3,4,5, сканировать весь файл и с большой вероятностью получить отсутствующее за несколько проходов. Скорость чтения со среднего диска 70-80 Мб/сек, т.е. 4Мб (миллион int`ов) прочитаются 20 раз в секунду . Можно предположить случай что последовательность 1-999`999 непрерывна, затем 1`000`001, тогда потребуется 13-14 часов, но это из области невероятного, т.к. генератор случайных чисел не дает такие последовательности. Даже если так и изначально прочитать в память (в кэш проца все войдет), то 4000-8000 сканов в секунду или 3-5 минут в худшем случае, задача параллелится и на 4 ядрах можно за минуту уложиться.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639183
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmiksoftЧисла не отсортированы. Как?Как искать наименьшее в один проход?
Сравнивать очередного кандидата с уже найденным претендентом.Вы совсем не вчитались в задачу.
Ищется не наименьшее присутствующее, а наименьшее отсутствующее.
В файле вполне могут быть числа 1,2,3, ... 1000, 1002, ... (только в произвольном порядке). А 1001 нужно найти.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639187
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТам в решении предлагается сначала отсортироватьСортировка нужна для поиска медианы.
Для поиска граничных значений сортировка избыточна. После того, как граничное значение известно - поиск дырки становится тривиальным.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639190
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПосле того, как граничное значение известно - поиск дырки становится тривиальным.Погорячился.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639192
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Решение "в лоб" можно ускорить тем, что переписать из исходного в промежуточный файл числа, которые меньше или равны миллиону. При равномерном распределении чисел это даст сокращение объема файла в тысячу раз.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639195
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftDima T,

Решение "в лоб" можно ускорить тем, что переписать из исходного в промежуточный файл числа, которые меньше или равны миллиону. При равномерном распределении чисел это даст сокращение объема файла в тысячу раз.
можно 1000 если будет 1000, то следующую 1000 и т.д. пока меньше 1000 за раз не считается. Случайное распределение заданное в ТЗ тоже надо использовать. 1000 условно, точнее его можно рассчитать из скорости записи и чтения файла и параметра "приемлемое время"
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639223
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миллион четырёхбайтовых чисел - меньше четырёх мегабайт.
Даже в рамках идиотских ограничений сортировка миллиона чисел не может дать миллиарды файловых операций.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639255
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxtravПопалась задачка. Есть ее решение. Но не могу понять хоть убей, как ее решает автор. Пожалуйста помогите. Растолкуйте решение.
http://www.lotos-khv.narod.ru/dist/lek6.htm

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

Перефразирую. В файле записаны 1'000'000 чисел из интервала 1 - 1'000'001 в случайном порядке. Найти пропущенное число. Как уже сказали, и в том и в другом случае будет как минимум одно число пропущено, нам осталось его найти.

Вот теперь оцениваем задачу правильно. :)

В итоге представленное решение (точнее идея) неплохое. Хотя я предложу немного лучше :)

Я по подобному принципу (на основании, кстати, метода быстрой сортировки) сортировал все числа у себя в программках (когда учился или участвовал в олимпиадах). Сортировка разумеется была побитная (то есть меняем местами числа, если число с соответствующим битом равным 1 стоит левее числа с тем же битом равным нулю. Таким образом рекурсия уходит максимум на n уровней, где n - число бит в числе)

Отвлёкся :) Итак... поясняю решение автора:

У нас есть миллион чисел, которыми можно заполнить без пробелов только миллион первых позиций. Потому, если есть пробел, то он находится в позиции от 1 до 1000000. Этот интервал мы и проверяем. Берём число 500000, начинаем читать файл и сравнивать каждое число с данным. Если прочитанное из файла меньше - прибавляем 1 к счётчику. Если в итоге счётчик равен 500000 - значит первые пол миллиона позиций заполнены без пробелов и нас интересует вторая половина миллиона. Итак, когда мы узнали в какой половине миллиона интересующий нас пропуск, повторяем то же действие для соответствующей половины миллиона, и делим ещё на 2 интервала... и так пока у нас не останется интервал в 1... именно он и будет нашим искомым пропуском.

Это всё нормальными словами и без лишних действий, которые он описал...

Не буду сильно комментировать его решение... из недостатков отмечу - он говорит о миллиардах операций, зато его программа сама вынуждена провести чтение 20'000'000 чисел по 4 байта (при чтении с диска в 512 байт, то есть по одному сектору, это будет около 16000 операций чтения). Замечу что методу быстрой сортировки потребуется приблизительно столько же... просто у него ещё будут затраты на запись чисел в их новые позиции.


На практике такая задача решилась бы в разы легче (мной по крайней мере). Я бы завёл файл на миллион байт и заполнил бы его нулями. А потом читая число из первого файла, выставлял бы байт во втором файле с соответствующим смещением в единицу (можно и с битами работать конечно, но тут вопрос простоты реализации. С битами не удобно работать). В итоге, задача свелась бы к чтению и записи миллиона чисел. После записи второго файла читаем его побайтово и смещении байта со значением 0 даёт нам искомое число (пропущенную позицию).

Кстати... на практике не бывает ограничения "не использовать массивы". :) А учитывая метод решения, если заюзать массив как напрерывный набор двоичных флагов, то и памяти на такой массив потребуется 8МБ. Большинству даже вэб приложений такое количество памяти спокойно выделяется (им выделяется даже в разы больше). Потому правильно тут сказали, при разумных ограничениях задача решаема в 2 прохода... 1 - пишем массив, второй - ищем пропуск.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639270
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то мне кажется автор там слишком мудрит
так же непонятно ограничение на массивы, сам он вполне их использует
видимо имеется ввиду что весь файл напрямую в массив загонять нельзя
если так, то достаточно выполнить подсчёт пройдясь по всему файлу

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
M1,M2,M3,M4 : array [0..255]of integer;

while no EOF(T) do begin
readln(v);
inc(M1[v and 255]); v :=v shr 8;
inc(M2[v and 255]); v :=v shr 8;
inc(M3[v and 255]); v :=v shr 8;
inc(M4[v and 255]); 
end;


и уже дальше анализировать
в этом русле решить задачу наверное будет легче
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639313
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ограничение на "неиспользование" массивов выглядит весьма странно. Особенно на фоне сортировок.
Ну... на малых выборки объёмах можно было задействовать массив с биткартой. Идея
- похожа на поиск неуникального целого числа в потоке целых.

А на больших объёмах - merge-сортировкой и 1 проходом по результату.

Или - гибридный вариант. Биткарта (по оценке) превышает memory двукратно - бъём
диапазон на два поддиапазона. И в два прохода находим дырку в "биткарте".
Всяко лучше чем сортировка.

Кстати совершенно напрасно автор ограничился типом integer... :)
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639346
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу ты, спать надо по ночам
простая задача, там действительно не надо массивов, щас время появится накатаю решение
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639351
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никакой сортировки там не надо
просто пройтись по файлу с подсчётом Log2(MaxN) раз
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
program o1;
type
  { TFIterator }
  TFIterator=class
  private
    FCurrent: integer;
   public
    function MoveNext:boolean;
    property Current:integer read FCurrent;
  end;
  { TSomeFile }
  TSomeFile=class
    public
     class function GetEnumerator():TFIterator;
  end;
{ TFIterator }
function TFIterator.MoveNext: boolean;
begin
  inc(FCurrent);
  Result:=(Current<=1000001);
  if Current=11111 then inc(FCurrent); //наш пропуск
end;
{ TSomeFile }
class function TSomeFile.GetEnumerator: TFIterator;
begin
  Result:=TFIterator.Create;
end;
var a:integer;
  f:TSomeFile;
  L,R,M:integer;
  C:integer;
begin
  f:=TSomeFile.Create;
  L:=1;
  R:=1000000000;
  repeat
    M:=(L+R)div 2;
    C:=0;
    for a in  f do begin  //цикл пробежки по файлу с подсчётом
      if (a<L)or(a>R) then continue;
      if a<=M then inc(C);
    end;
    if C<(M-L+1) then begin
      R:=M;
    end else begin
      L:=M+1;
    end;
  until L=R;
  Writeln(L); // найденная дырка
  f.Free;
end.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639352
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕе автор - хабаровская "школа программистов". Она и должна растолковывать и пояснять
потоки своего сознания. При чём здесь sql.ru - непонятно.

именно в кавычках, поддерживаю


miksoftВы совсем не вчитались в задачу.
Ужасная постановка задачи.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639354
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрБольше всего улыбнуло желание автора статьи доказать свою правоту, а потому "неудачные" решения расчитываются исходя их миллиарда элементов, а удачное - из миллиона. Круто конечно ))) откуда взято число миллиард?! Да от балды...

Перефразирую. В файле записаны 1'000'000 чисел из интервала 1 - 1'000'001 в случайном порядке. Найти пропущенное число. Как уже сказали, и в том и в другом случае будет как минимум одно число пропущено, нам осталось его найти.

такая постановка решается очень просто :), код примерно такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	//поиск единственного отсутствующего
	int res = 1 ^ *(a + 0);
	for (int i = 2; i < 1000001; i++)
	{
		res = res^(*(a + i - 1)^i);
	}
	res = res ^ 1000001;



если индексы не напутал, но смысл думаю понятен :)
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639355
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гадкое решение ужасно поставленной задачиПоделим миллиардный интервал на два интервала по 500 миллионов. Где может находиться искомое число? Очевидно, в первом, так как 500-миллионный интервал миллионом чисел не заполнить. Теперь поделим первый 500-миллионный интервал на два и т. д. Рано или поздно заключение о том, что интервал, содержащий искомое число, будет первым, окажется несправедливым. Поэтому давайте для любой пары интервалов разработаем более универсальный метод.
а где в постановке задачи написано что все числа должны быть подряд ?????


ужасная постановка задачиИз числового интервала от единицы до миллиарда выбираются случайным образом без повторений миллион чисел и записываются в файл. Необходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле. Использовать массивы или иные структуры данных, их заменяющие, запрещается.


а если они подряд, то можно найти мак и мин, и сделать через код приведённый мной выше.
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639382
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, для олимпиады задача вполне нормальная
автора где в постановке задачи написано что все числа должны быть подряд ?????
как раз написано обратное
авторИз числового интервала от единицы до миллиарда выбираются случайным образом без повторений миллион чисел и записываются в файл
авторНеобходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле.

т.е. нет если в файле 1 - значит единица

задача на бинарный поиск - сложность C(log(N)*N), где N - количество цифр в файле

я правда в начальных условиях погорячился
Код: pascal
1.
2.
  L:=1;
  R:=1000000000;


достаточно
Код: pascal
1.
2.
  L:=1;
  R:=L+1000000;


искомое число может быть в интервале [1..N+1]

никаких сортировок тут делать не нужно
...
Рейтинг: 0 / 0
Выборка из миллиарда
    #38639396
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxtrav,
Код: vbnet
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.
Sub w140513_0845()
Dim s1, s2, j1, j2
''Выборка из миллиарда
''
''Условие задачи.
''
''Из числового интервала от единицы до миллиарда выбираются случайным образом без
''повторений миллион чисел и записываются в файл.
''Необходимо за приемлемое время выяснить, какое наименьшее число отсутствует в файле.
''Использовать массивы или иные структуры данных, их заменяющие, запрещается.

''=================упрощенный пример================
''есть 10 цифр, выбрано случайно 6
''
''возможны две ситуации
''1-выбраны от 1 до 6 , решение= 7
''2-выбор включает дырку,например=4
''
s1 = "`5`1`6`2`4`3`"           '''выборка1, числа через любой разделитель
's1 = "`5`1`6`2`9`3`"           '''выборка2, числа через любой разделитель
j1 = 0

Do While j1 <= 6
j1 = j1 + 1

s2 = "`" & j1 & "`"            '''
If InStr(s1, s2) = 0 Then

Debug.Print s2
Exit Do
End If

Loop
End Sub



подобные задачи решаю поиском в строке
здесь сложность --в длине строки(1000000 по 6 символов и 2 разделителя=8млн символов), несколько меньше с учетом длины числа
количество чиселзначностьразделители91 цифра2902290032900042900005290000062
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 1 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выборка из миллиарда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]