|
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 21
|
|
Найти самую длинную возрастающую цепочку простых чисел13.09.2011, 10:55. Показов 6061. Ответов 8
Метки нет (Все метки)
Привет всем
Решаю задачку: Найти самую длинную возрастающую цепочку простых чисел В заданном бинарном файле необходимо найти самую длинную возрастающую цепочку простых чисел. Бинарный файл трактуется как последовательность 6-ти байтовых беззнаковых целых. Размер файла может быть любым, если размер файла не кратен 6, то лишние байты с конца файла игнорируются. Элементы цепочки не обязаны идти друг за другом в файле, между элементами цепочки могут встречаться не простые числа в любом количестве. Из двух цепочек одинаковой длины предпочтение отдается той, у которой первый элемент больше. Если длины и первые элементы цепочек совпадают, предпочтение отдается той, у которой смещение первого элемента меньше. Задача должна быть реализована в виде консольного приложения для Windows 32bit и должна быть выполнена на языке C++. Файл с данными указывается как параметр командной строке. Реализация должна быть многопоточной, хочется иметь бонус от запуска приложения на многопроцессорных (Core2Quad) системах. Отдельный плюс, если во время выполнения будет отображаться прогресс обработки файла. Результатом работы должен быть вывод первого элемента цепочки и его смещения, последнего элемента цепочки и его смещенья и длины цепочки, или, если цепочка не была найдета – сообщение об этом прискорбном факте. Примеры формата файла: Содержание файла (byte, hex, 34 байта) 01 00 00 00 00 00 02 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80 00 FF FF FF FF Числа в файле 1, 2, 3, 140737488355328, 549755813888 Примеры последовательностей и найденные цепочки: Последовательность 2, 3, 5, 3, 5, 7, 11 2, 3, 4, 5, 6, 7, 3, 5, 7 2, 3, 10,5, 6, 7, 3, 5, 7 2, 3, 3, 5, 6, 7, 3, 5, 7 2, 3, 5, 3, 5, 11 2, 3, 5, 2, 5, 11 Найденная цепочка 3, 5, 7, 11 2, 3, 5, 7 2, 3, 5, 7 3, 5, 7 3, 5, 11 2, 3, 5 Может кто-нить уже сталкивался с подобным сабжем, заранее спасибо за комменты? Добавлено через 13 часов 3 минуты Если есть идеи пишите
0
|
|
| 13.09.2011, 10:55 | |
|
Ответы с готовыми решениями:
8
Найти самую длинную последовательность простых чисел Найти самую длинную подпоследовательность массива из простых чисел |
|
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
|
| 13.09.2011, 13:31 | |
|
Не встречалось. Между прочим задачка интересная.
Идеи такие: *. разбить на подзадачи, реализовать каждую отдельно, сложить вместе и получить профит. 1. определиться с алгоритмом определения простоты. Насколько я понимаю нам необходимо гарантировано знать, является ли заданное число простым. Без поиска по литературе мне известно два алгоритма: акс и перебором. Где-то читал, что для определения простоты числа перебор является одним из оптимальных алгоритмов для чисел меньших 2^20 (без пруфлинка). Пусть это будет функция is_simple(); 2. Поскольку большинство вычислений будут проходить в is_simple(), именно её выделять в отдельную нить. 3. Пишем под вин, сия ОСЬ вроде бы умеет автоматически разбрасывать нити по процессорам с оптимальным распределением нагрузки, так что с этим можно не заморачиваться. 4. Реализуем чтение чисел из фаила, передачу оных в нити, хранение выделенных последовательностей, контроль работы ниток. для начала как-то так.
0
|
|
|
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
|||||||||||
| 15.09.2011, 14:20 | |||||||||||
|
Ниже: трэд, нить, поток - синонимы, мэйн-трэд - основной поток процесса.
Касательно собственно вычислений. Старался комментировать подробно. Общий принцип: считать последовательность в массив, выделить простые. После этого можно выделять возрастающие подпоследовательности и искать наидлиннейшую или еще каким либо образом с ними работать. Заголовочник simple.h содержит объявление функции определения простоты числа, например такой
Код является примером работы с потоками RTL и не более того. Чуть позже напишу несколько соображений касательно того как такая задача должна решаться. Каждый поток выполняет расчеты для k+th члена последовательности (где k = 1,2,3... и т.д, а th - номер потока), то есть 3-й поток из 8 проверит 3,11,19 и т.д. члены. При порождении трэда ему нужно передать значение th, поскольку это действие выполняется передачей указателя на переменную( которая выступает итератором в порождающем трэде) то, происходят "финты ушами" - помещение значения итератора в массив и передача указателя на элемент массива (то есть каждому порождённому трэду будет соответсвовать свой элемент массива).Это не совсем красиво, но остальные варианты очень громоздки. Ну и последнее замечание: тема для меня новая, возможно что-либо можно сделать более оптимально/рационально/просто. пример.
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 21
|
|
| 15.09.2011, 14:31 [ТС] | |
|
Спасибо Vladimir.
Я пробовал сделать, пока точно так не получается: Примерно последовательность такая: 1. Считываем в поток ввода бинарный файл из argv[..] 2. Записываем его в vector<UINT8> (где typedef unsigned long int UINT8) 3. Начинаю анализировать перебором в сравнении что следующий элемент больше текущего 4. Далее выделяю это в отдельный массив векторов. 5. Вот тут дальше вопрос как определять что число простое и что можно поместить в отдельные нити расчитывать
0
|
|
|
Higher
|
||||||||||||
| 15.09.2011, 16:06 | ||||||||||||
|
А задача простая в общем-то... Решается динамикой кстати. Добавлено через 15 минут Для подпоследовательности(не цепочки, для цепочки нужно подправить пару строк) как-то так получится.
Для цепочки еще проще
0
|
||||||||||||
|
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
|
| 15.09.2011, 16:14 | |
|
в продолжение моего поста:
Смысл распараллеливания вычислений на нескольких процессорах в первую очередь в получении выгоды по времени. первое: в приведённом выше примере данные сначала считываются а потом обрабатываются. Значит, если время чтения 50 секунд, и время вычислений 50 секунд, то распределив вычисления по 4 потокам в результате имеем 40% профита ( 50+50/4 = 62 секунды вместо 100 секунд в случае однопоточных вычислений.) второе:, если одному из потоков попадётся набор больших и, следовательно, сложных для проверки чисел, то остальные потоки справившись со своими задачами будут вынуждены ждать "неудачника". Что еще уменьшит профит (причем уменьшать будет довольно быстро) третье: то, чего не делали - нужно еще найти наибольшую подпоследовательность, что тоже потребует времени. четвертое: выбран не самый удачный тест простоты. первые три пункта исправляются так: в начале программы создаётся нужное количество вычислительных потоков (далее пул), они переводятся в режим ожидания, так же создаётся поток для чтения данных из фаила и поток для поиска наибольшей подпоследовательности который тоже ждёт своего часа. Поток ввода работает с двумя буферами. Сначала данные из фаила помещаются в буфер1, буфер1 отправляется пулу (вернее пул получает разрешение работать с буфером). Поток ввода не останавливаясь заполняет буфер2. Когда буфер2 заполнен, ввод приостанавливается. В это время пул потоков обрабатывает буфер1 : Каждый вычислительный поток берёт число из буфера, выполняет для него тест простоты и отправляет результат потоку поиска, после чего берёт новое число из буфера. И так пока буфер не опустеет. После того как пул обработает весь буфер, потоки переводятся в режим ожидания. Если буфер2 полон, а буфер1 пуст - они меняются местами, поток ввода снова начинает считывать данные из фаила, а пул обрабатывать числа из полного буфера. А параллельно этому всему работает поток поиска, выявляя в переданных ему пулом данных максимальную подпоследовательность. После окончания фаила и завершения вычислений во всех потоках, происходит вывод результата, освобождение ресурсов и т.п.
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||
| 15.09.2011, 16:36 | |||||||
Эта функция проверяет число на простоту плюс можно класть число в структуру с флагом. Как проверять - Vladimir в принципе всё расписал. Потом все нити объединяются, и проходимся по структурам,считая последовательности. Размер последовательности можно хранить прямо в структуре числа, а также его смещение в файле. Например:
Сразу в цикле можно создать максимально возможный блок тредов или меньше, в зависимости от размера файла.(например, у меня на 32-битной системе было ограничение в примерно 280-300 тредов) . На 64-битной системе ограничение гораздо больше (несколько десятков тысяч,точно не знаю). Если файл больше чем (блок тредов)*(размер числа), то создаём блоки нитей пачками, пока не достигнем конца файла.
0
|
|||||||
|
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
||
| 15.09.2011, 16:43 | ||
|
1 и 2 смущает, можно функции посмотреть?? 3 и 4: 12 13 14 15 16 3 17 18 - здесь одна подпоследовательность 13 17, у вас она окажется в разных массивах, вы учли такой вариант?? 5. методы определения простоты числа есть на вики хотя бы... diagon, вы хотябы задание читали перед ответом.
0
|
||
|
Higher
|
||
| 15.09.2011, 16:49 | ||
|
А по условию не подходит этот пример 2, 3, 5, 3, 5, 7, 11 там двойка красным не выделена, а она является простым числом и меньше тройки. Это меня и смутило. А предложил потому, что за O(~nlogn) работает, я варианта быстрее не знаю. А, нет, между ними же не может идти простых чисел. Еще одно условие в 40 строку добавить(если число простое, то выходить из цикла) и алгоритм заработает еще быстрее в лучшем случае.
0
|
||
| 15.09.2011, 16:49 | |
|
Помогаю со студенческими работами здесь
9
В строке string найти самую длинную строго возрастающую подстроку
В одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является «палиндромом» Найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|