|
║XLR8║
|
|||||||||||
Быстрый стек, с малым обьемом памяти10.01.2010, 15:23. Показов 5079. Ответов 36
Метки нет (Все метки)
нужно за 1 секунду и 0,75Мб памяти обработать 0 < N ≤ 100000 запросов к 1 ≤ A ≤ 1000 разным стекам, гарантируется что все запросы коректны, т.е. вывод елемента со стека не может быть раньше чем ввод. Вроде написал, но компилятор упорно говорит что cannot convert parameter 1 from 'int' to 'void *', как видно a = (int *) realloc(--sz, sizeof(int)); я (int *) дописал, т.е. все верно, может я чего-то непонял, в чем ошибка, подскажите пожалуйста.. Добавлено через 3 минуты немного доработал ввод, на сишный, т.к. он быстрее, но ошибка с выделением памяти осталась, вот код
0
|
|||||||||||
| 10.01.2010, 15:23 | |
|
Ответы с готовыми решениями:
36
|
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||||||
| 10.01.2010, 21:24 | ||||||
1
|
||||||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 10.01.2010, 21:52 | |
|
в памяти выделяется одна структура типа block_t
block_t *pblk= malloc( sizeof(block_t) );
1
|
|
|
║XLR8║
|
|||||||
| 10.01.2010, 22:02 [ТС] | |||||||
|
Добавлено через 1 минуту
куча ошибок: Добавлено через 1 минуту 16 C:\Documents and Settings\Администратор\Рабочий стол\timus.c syntax error before "stack" 16 C:\Documents and Settings\Администратор\Рабочий стол\timus.c [Warning] no semicolon at end of struct or union 19 C:\Documents and Settings\Администратор\Рабочий стол\timus.c [Warning] data definition has no type or storage class 20 C:\Documents and Settings\Администратор\Рабочий стол\timus.c syntax error before '}' token 22 C:\Documents and Settings\Администратор\Рабочий стол\timus.c syntax error before '&' token C:\Documents and Settings\Администратор\Рабочий стол\timus.c In function `push': 27 C:\Documents and Settings\Администратор\Рабочий стол\timus.c `block_k' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) 31 C:\Documents and Settings\Администратор\Рабочий стол\timus.c `inf' undeclared (first use in this function) 31 C:\Documents and Settings\Администратор\Рабочий стол\timus.c `n' undeclared (first use in this function) At top level: 34 C:\Documents and Settings\Администратор\Рабочий стол\timus.c syntax error before '}' token
0
|
|||||||
|
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
|
|||||||
| 10.01.2010, 22:20 | |||||||
|
У меня другое решение. Я создаю массив определенного размера и массив дескрипторов на него. То есть грубо говоря - разбиваю массив на страницы (извиняюсь, за неправильный термин, но не знаю, как ещё можно сказать). Отдельно есть массив char, содержащий 0 - если данный блок свободен, 1 - если занят. Я думаю, что сдесь лучше сего было использовать биты, а не байты, то было бы лучше. Если объясните, как делать тоже самое, только с битами, скажу СПАСИБО.
Тут два класса Memory - описывающий функции allocate_block free_block - выделяющий память и помечающий блок, как свободный. Реализация стека через выделяемые блоки памяти. Писал на С++, поэтому накладных расходов много. Вот код. Извиняюсь за неструктурированнось, так классы были разбиты по файлам, которые я инклюдил.
Добавлено через 33 секунды Результат:
Извиняюсь за кодировку...
1
|
|||||||
|
║XLR8║
|
||
| 10.01.2010, 22:41 [ТС] | ||
|
Добавлено через 9 минут подскажите как мне доделать свой вариант? катать ваш пример не хочу, толку будет мало, а так в голове останется..
0
|
||
|
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
|
|
| 10.01.2010, 23:31 | |
|
Я так понимаю, что ты хочешь сделать через списки.
Тебе потребуется массив из 1000 структур, содержащие 1. Смещение внутри твоего 19-ти элементного блока 2. Указатель на начало списка Список состоит из структур, котрые, как уже я увидел ты сделал. Суть в чем - у тебя есть массив из структур, назови его своеобразной кучей struct data_block { int data[19]; data_block *next; } и есть массив битов, которые показывают свободен ли этот блок. 1. Запись Записывай в текущем блоке преременные, пока смещение не будет 18 (счет в си с 0 )Если блок забит - найди по биту первый свободный блок и пристыкуй его к своему списку. Установи смещение на 0. 2. Чтение. Считывай, пока смещение не станет 0.Как только стало нулем отстыкуй блок. Пометь его как свободный (для дальнейшего использования). Установи смещение на 18 (последный элемент). В целом - это примитивный алгоритм. Я бы описал основные данные так: struct data_block { int data[19]; data_block *next; } - твоя единица памяти data_block array[ Максимальное_ЧИСЛО_БЛОКОВ_В_СИСТЕМЕ]; byte access[Максимальное_ЧИСЛО_БЛОКОВ_В_СИСТЕМЕ]; // Здесь бы использовать битовое поле. Но я его не знаю. struct stack_begin { int offset; data_block* last; //Это излишне. Для того, что бы каждый раз тебе не пробегать по списку, для нахождения последнего элемента. Быстродействие увечилит в разы, а память сожрет только паку килобайт (ну или десятков) data_block* first; //Указатель на первый блок } Теперь надо будет обьявить пару функций 1. Запихни в стек 2. Вытащи из стека + дополнит. функции 1. Верни свободный блок из кучи 2. Возвтрати блок в кучу. 3. Верни адрес предпоследнего блока в списке. Ты так хотел делать?
1
|
|
|
║XLR8║
|
||||||||||||||||
| 11.01.2010, 09:55 [ТС] | ||||||||||||||||
|
GRANDEATH, то как я хотел сделать я сделал, дальше я потерялся, просто у меня выходит, что выделяем мы память сразу всю, и при этом говорим две вещи:
1) каждому непустому стеку как минимум 1 блок 2) в каждом блоке 19 элементов Вот эти две вещи меня и запутали, т.к. у нас каждый стек, который занимает больше N*19 элементов будет занимать на 18*4 байта больше чем он должен занимать.. Спасибо большое за детально расжеваный алгоритм, и за то что нет ни строчки кода. Попытаюсь как-то закодить..
Добавлено через 39 минут поисправлял ошибки, int stack :: pop() возвращала не предыдущий а следующий, вот верный код:
С++ Wrong answer 0.015сек 481 КБ ![]() Добавлено через 5 минут У меня вылетает последний елемент блока Добавлено через 6 минут нашел, исправил, вот
Добавлено через 1 минуту Результат проверки № теста Время работы Выделено памяти Memory limit exceeded 10 0.062 869 КБ
0
|
||||||||||||||||
|
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
|
||
| 11.01.2010, 15:41 | ||
+ сотри #icnclude <iostream> Мало ли что системе в голову взбредет...
1
|
||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|||
| 11.01.2010, 15:45 | |||
Например зачем вот это:
1
|
|||
|
39 / 39 / 1
Регистрация: 13.09.2009
Сообщений: 108
|
||||||
| 11.01.2010, 15:45 | ||||||
Тут она отрезает 60 000* 20 (размер блока) * 4 (занимает int) = 60 кб * 20 * 4 это дофига памяти. Что-то она больно мало показала
1
|
||||||
|
║XLR8║
|
|||||||
| 11.01.2010, 17:19 [ТС] | |||||||
|
Добавлено через 1 минуту сколько тогда нужно выделить heap_size и block_size что-бы было норм? Добавлено через 6 минут Crash (access violation) 10 0.046 689 КБ на этом коде:
0
|
|||||||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 11.01.2010, 18:05 | ||
По умолчанию НИЧЕГО не выделено. Выделение памяти происходит по запросу - как требуется память.
1
|
||
|
║XLR8║
|
|||
| 11.01.2010, 19:29 [ТС] | |||
|
Добавлено через 4 минуты
0
|
|||
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
||
| 11.01.2010, 19:32 | ||
|
Я уже отказался от этой идеи
![]() Решил выделять блоками. Прикол в том, что там неизвестно какой компилятор и трудно выделить ровно столько памяти чтобы ее хватило и в тоже время не перебрать. Выделение делаю malloc(), не использую realloc() и никогда не делаю free(). Добавлено через 45 секунд
Ссылки очень просто - ссылка - это номер в массиве ![]() То есть сразу выделяем 700000 байт одним куском. Этого точно хватит на задачу.
0
|
||
|
║XLR8║
|
||||||
| 11.01.2010, 20:05 [ТС] | ||||||
|
опять запутался, давайте я скажу на что у меня расходуется память а вы скажете где ее можно укротить?
я выделяю 2 блока, 1-ый для нужд самих стеков, он идет 400 Кб, 2-ой в качестве битмаски, он на 40 Кб потом при создании стеков, каждые ил элементов имеет два указатели, 1 на значение, и 1 на предыдущий элемент, и того максимум 40 Кб + 4 Кб на текущие размеры стеков + 2 инта в мейне и масив 5 чаров, и того = 400+40+40+4+8+20 = 512 Кб Добавлено через 11 секунд
где еще 300 Кб спрятано?
0
|
||||||
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
||||||
| 22.06.2010, 13:06 | ||||||
|
Вот читерское решение.
1
|
||||||
| 22.06.2010, 13:06 | |
|
Стек и освобождение памяти Стек. Нехватка памяти. Числа в тексте Ошибка сегментирования (стек памяти сброшен на диск) Прочитать последовательность из файла и создать стек в памяти Ошибка сегментирования (стек памяти сброшен на диск) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки.
Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён".
Изменено отображение буквы Й.
Добавлена. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|