|
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 21
|
|
Найти самую длинную возрастающую цепочку простых чисел13.09.2011, 10:55. Показов 6042. Ответов 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 найти самую длинную строго возрастающую подстроку
В одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является «палиндромом» Найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|