Итак, есть 3 массива. необходимо найти количество чисел, которые есть во всех 3-х массивах. проблема заключается в том, что необходимо это сделать довольно быстро. например, решение, при котором я эти три массива объединяю в один, а затем ищу функцией list.count(a[i]) (python 3), и если значение равно трем инкрементирую переменную count, затем вывожу count//3 -- такое решение слишком медленное. решение при котором я перебираю переменные из самого большого массива, и если они есть в обоих других массивах (тоже через функцию count), то я инкрементирую count - оно тоже слишком медленное.
216
251
Ответы на вопрос:
Язык программирования не указан, сказано только, что была сделана попытка создать алгоритм в пайтоне, но работа оказалась медленной. это не удивительно, ведь пайтон - интерпретатор и там уж не до оптимизации. предлагаю решение на pascalabc.net. приводятся тайминги пяти прогонов, разрешение таймера - 16 мс. исходные последовательности: - 1 млн случайных целых из [100; 2000]; - 2 млн случайных целых из [50; 1500]; - 3 млн случайных целых из [1; 1000]; алгоритм: - генерируем последовательности; - создаем и заполняем для каждой последовательности частотный словарь в виде кортежа < ключ> < количество> , где ключ - значение элемента, количество - количество раз, которое этот элемент встретился в последовательности; - создаем последовательности ключей для всех трех словарей и находим их пересечение; - удаляем из каждого словаря элементы, ключей которых нет в пересечении; - создаем на основе каждого словаря последовательность значений (частот) и сортируем её по возрастанию; - для каждой пары значений первой и второй последовательности выбираем минимальное значение, а затем поступаем так же с результирующей и третьей последовательностью, находя в конце сумму её членов. // pascalabc.net 3.2, сборка 1374 от 10.01.2017 // внимание! если программа не работает, обновите версию! begin var t0: =milliseconds; var a1: =arrrandom(1000000,100,2000); var a2: =arrrandom(2000000,50,1500); var a3: =arrrandom(3000000,1,1000); var t1: =millisecondsdelta; writeln('инициализация: ',t1,' мс'); millisecondsdelta; var d1: =new dictionary< integer,integer> ; foreach var e in a1 do d1[e]: =d1.get(e)+1; var d2: =new dictionary< integer,integer> ; foreach var e in a2 do d2[e]: =d2.get(e)+1; var d3: =new dictionary< integer,integer> ; foreach var e in a3 do d3[e]: =d3.get(e)+1; t1: =millisecondsdelta; writeln('заполнены частотные словари: ',t1,' мс'); millisecondsdelta; var kd1: =d1.select(e-> e.key).toarray; var kd2: =d2.select(e-> e.key).toarray; var kd3: =d3.select(e-> e.key).toarray; var ki: =kd1.intersect(kd2).intersect(kd3); // пересечение ключей t1: =millisecondsdelta; writeln('получено пересечение ключей: ',t1,' мс'); millisecondsdelta; foreach var k in kd1 do if not (k in ki) then d1.remove(k); var v1: =d1.orderby(x-> x.key).select(x-> x.value); foreach var k in kd2 do if not (k in ki) then d2.remove(k); var v2: =d2.orderby(x-> x.key).select(x-> x.value); foreach var k in kd3 do if not (k in ki) then d3.remove(k); var v3: =d3.orderby(x-> x.key).select(x-> x.value); var m: =v1.zip(v2,(x,y)-> min(x,(v3,(x,y)-> min(x,; t1: =millisecondsdelta; writeln('получен результат: ',t1,' мс'); millisecondsdelta; writeln(m); end. результаты инициализация: 234 мс заполнены частотные словари: 312 мс получено пересечение ключей: 0 мс получен результат: 1000 мс 474970 инициализация: 234 мс заполнены частотные словари: 312 мс получено пересечение ключей: 16 мс получен результат: 984 мс 474137 инициализация: 250 мс заполнены частотные словари: 312 мс получено пересечение ключей: 16 мс получен результат: 984 мс 474176 инициализация: 234 мс заполнены частотные словари: 312 мс получено пересечение ключей: 0 мс получен результат: 1000 мс 474090 инициализация: 234 мс заполнены частотные словари: 312 мс получено пересечение ключей: 16 мс получен результат: 984 мс 474108 как видно из результатов, в указанных условиях из 6 млн значений отбирается примерно 475 тыс и занимает это порядка полутора секунд на достаточно немолодом пк c процессором intel core 2 duo (3 ггц) и 2 гб оперативной памяти. вполне приемлемо.
program oddeven;
var a: integer;
begin
writeln('введите число');
readln(a);
if a mod 2 = 0 then
writeln('число чётное')
else
writeln('число нечётное');
end.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Noooo12345610.03.2021 02:42
-
Bihan23128.04.2021 17:21
-
jamesa9929.07.2020 17:42
-
плюскваммиперфекти16.05.2020 18:03
-
animals20002720.05.2021 15:11
-
inak4561223.09.2022 00:56
-
vadim36923.12.2020 01:59
-
viktoriyameshh11.06.2023 16:58
-
dmitrijezhov2019.04.2020 06:29
-
Airehon18.10.2021 01:36
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.