singlepost

Слишком большие переменные << На главную или назад  

37 ответов в теме “Слишком большие переменные”

  1. 37
    Александр Чигринец ответил:

    >>Вообще, мне в начале дано начало слова, а надо из этих 200000
    >>выбрать K<=2000 слов, начинающихся также. А если их больше К, то
    >>те у которых самые большие числа.
    По моему никаких seek тут не должно быть. Имеем файл записей <Число, строка>. Файл читается в один проход по записям, каждая строка сравнивается с заданным шаблоном. Если подходит, то кладётся в отсортированный по числу массив. Если массив заполнился, то элемент с меньшим числом замещается.
    А уж 2000 элементов паскалевский массив вполне потянет.

  2. 36
    Дмитрий Бойко ответил:

    =))

  3. 35
    Марат Гаязов ответил:

    Найдут – не найдут, это смотря как код напишешь;) =)

  4. 34
    Дмитрий Бойко ответил:

    запрещено правилами, а не програмно. т.е. если найдут могут исключить

  5. 33
    Марат Гаязов ответил:

    :) Ну буфер хорошая идея… Только вопрос как ориентироваться в буфере тоже интересен:)
    Дмитрий мне также интересно КАК можно запретить использование системных функций:)
    Жека, ну естественно, я с тобой согласен:)
    ЛЮДИ, я предложил способ, который вам ясен и понятен, но достаточно громоздк и неудобен, чтобы и мне и вам не нравится… так может лучше кто нибудь предложит что то еще? А то обсудить все хороши, а как вперед выйти-страшно, а вдруг поезд навстречу пустят?:)

  6. 32
    Леонид Максимов ответил:

    имхо fseek может быть доступен не всегда – например при чтении из пайп-файла

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

  7. 31
    Жека Кирпичев ответил:

    Время в хороших олимпиадных задачах обычно тратится не на чтение из файла. Если, конечно, не выпендриваться и не пользоваться seek'ом, а решать как следует :)

  8. 30
    Жека Кирпичев ответил:

    У вас запрещен системный вызов fseek? Каким образом, интересно?

  9. 29
    Дмитрий Бойко ответил:

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

  10. 28
    Алексей Фёдоров ответил:

    Динамический массив,и все должно получиться.

  11. 27
    Марат Гаязов ответил:

    Не разрешено копировать, изменять файл…а множественноеобращение очень даже можно…

  12. 26
    Станислав Лысиков ответил:

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

  13. 25
    Дмитрий Бойко ответил:

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

  14. 24
    Марат Гаязов ответил:

    Эффективный алгоритм иногда с ходу не придумать, как например сейчас…а олимпиадное время то течет…я не говорю конечно, что стоит втупую сразу использовать первые пришедшие на ум схемы…иначе получится забивание гвоздей микроскопом…
    Просто подумать и использовать то что считаешь наиболее подходящим-вот и все что нужно:) У меня опыт олимпиад большой, нравятся мне такие заморочные задачки…

  15. 23
    Илья Езепов ответил:

    Спасибо большое за помощь

  16. 22
    Станислав Лысиков ответил:

    Так любая олимпиада – это и есть изуверство :)

  17. 21
    Алексей Сторожев ответил:

    за это я и любил олимпиады!

  18. 20
    Жека Кирпичев ответил:

    Это уже не хитрость, а изуверство – задача состоит в том, чтобы придумать эффективный алгоритм, а не в том, чтобы использовать memory-mapped файлы и т.п. :)

  19. 19
    Марат Гаязов ответил:

    В данном случаем Станислав прав…
    здесь надо обрабатывать строки по одной… в этом то и изюминка задачи, что все что есть ты не загонишь в оперативу как переменную…тут либо динамическая память, либо хитрость…
    А хитрость тут можно такую применить-зачем все гнать в оперативу, если файл-это тоже память?М? только хранится на жестком, и доступ к ней чуть сложнее… Нужен указатель – не вопрос, создай переменную, которая хранит положение местоположение указателя в файле, нужно считать значение-позиционируйся в файле и считывай;) и ты ды…тут фантазия нужна;) Так как твоя задача наверняка не относится к задачам реального времени, то на скорость обработки никто внимания не обратит…удачи;)

  20. 18
    Станислав Лысиков ответил:

    Даже вашим методом, зачем вам массив для слов?
    Проще же читать строку: сравнил слово, если подходит -> записал номер строки + число занести в упорядоченный массив. При обработке следующей строки, которая подходит, проверить к>2000 и если да, то текущее число больше или меньше самого меньшего. Больше – вставить и выкинуть самое меньшее, меньше – откинуть строку. Потом строки просто скопировать из исходного файла на вывод.
    А вообще можно даже еще проще.. :)

  21. 17
    Илья Езепов ответил:

    Нет, там не 200000 строк из чисел, а 200000 строк, где кождая строка включает в себя строку и число. Вообще, мне в начале дано начало слова, а надо из этих 200000 выбратьK<=2000 слов, начинающихся также. А если их больше К, то те у которых самые большие числа.

  22. 16
    Жека Кирпичев ответил:

    В таких задачах обычно решение подразумевает, что ты НЕ сохраняешь все данные в массив, а считаешь решение прямо по ходу чтения из файла.

  23. 15
    Алексей Сторожев ответил:

    дык ты дай условие полное, че с данными делать-то надо?

  24. 14
    Алексей Божко ответил:

    Хочется не хочется, а без указателей ни туды и ни сюды. Либо преобразовуй алгоритм так, чтобы не было таких массивов

  25. 13
    Станислав Лысиков ответил:

    это с олимпиад, да? интересные, конечно, задания с файлами на 200000 строк по одному числу %)
    а разве нельзя загнать не строки, а числа сразу?

  26. 12
    Станислав Лысиков ответил:

    кстати, а почему нельзя на входе преобразовывать строку в число и не засовывать в массив?

  27. 11
    Илья Езепов ответил:

    Выдаёт две ошибки:
    1) Error 29: Ordinaltype exepted—- когда создаю массив из 200000 эл.
    2) Еrror 22: Structure too large—-когда уменьшаю число эл. до 20000

  28. 10
    Илья Езепов ответил:

    А задача сводится к следующему:
    Мне дан файл где N<=200000 строк следующего вида: <строка-число>,
    где строка по длине <=10 символов, а число<=10^9
    Как решать я знаю, проблема в том, чтобы всё это загнать в паскаль

  29. 9
    Алексей Божко ответил:

    Ну по моему в таких случаях используют указатели (динамические массивы).

  30. 8
    Илья Езепов ответил:

    Чё-то мне с длинной арифметикой париться не хочется.

  31. 7
    Леонид Максимов ответил:

    если это действительно паскаль под дос, то больше 64к в одной переменной не получится – ограничение размером сегмента

    интересно, зачем может понадобиться 2е5 строк? может быть их стоит хранить в файле?

  32. 6
    Дмитрий Бойко ответил:

    есть вариант попроще выделения памяти. можно просто восьпользоваться Делфи, если писать в консольном для консоли, все тоже самое что и на паскале, только первую строчку дописать {$apptype console} и расширение файла не пас а .dpr

  33. 5
    Александр Меньшаков ответил:

    Если из под голого ДОС без менеджера памяти, то структуру в 2Мб не создать – памяти не хватит. Хотя сомневаюсь, что тут такой случай – времена дос и машин с 640кб памяти кончились вроде как давно =)
    Думаю все же косяк в коде – скинь сюда ошибку дословно с ее числовым кодом. Чтобы создать такую структуру есть 2 варианта:

    вариант №1
    var
    myarr: array[1..200000] of string[10];
    вариант №2
    type
    Tmyarr=array[1..200000] of string[10];
    Pmyarr=^Tmyarr;
    var
    myarr:Pmyarr;
    затем в коде
    new(myarr);

  34. 4
    Александр Меньшаков ответил:

    Блин, тут уже как на voffka.com… пока пишешь коммент уже 10 появится =)))

  35. 3
    Алексей Сторожев ответил:

    импасибыл
    но попробуй выделить память

  36. 2
    Алексей Сторожев ответил:

    ченить типо
    type
    TStr = string[10];
    TArr = array [1..200000] of TStr;
    PArr = ^Tarr;
    var
    arr: PArr;
    begin
    if (MaxAvail < sizeof (arr)) then
    begin
    writeln ('not enough memory');
    halt;
    end;
    new (PArr);
    end.

    не проверял, может чето немного не так

    а вообще, зачем такой массив? дай задачу – 100% можно обойтись без таких геморроев

  37. 1
    Илья Езепов ответил:

    В паскале нужно обьявить массив(одномерный) из 200000 элементов, каждый – это строка длинной в 10 символов. Он ругается, что слишком большая переменная. Что делать не знаю.Please help me.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.