• Итак, есть 3 массива. Необходимо найти количество чисел, которые есть во всех 3-х массивах. Проблема заключается в том, что необходимо это сделать довольно быстро. Например, решение, при котором я эти три массива объединяю в один, а затем ищу функцией list.count(a[i]) (Python 3), и если значение равно трем инкрементирую переменную count, затем вывожу count//3 -- такое решение слишком медленное. Решение при котором я перебираю переменные из самого большого массива, и если они есть в обоих других массивах (тоже через функцию count), то я инкрементирую count - оно тоже слишком медленное.

Ответы 4

  • Частотный словарь - это список из двух элементов, первый из которых содержит ключ, совпадающий с одним из элементов исходных данных, а второй - количество повторений этого ключа в этих данных. Например, если дан текст, то частотный словарь будет содержать для каждой буквы количество раз, которое эта буква встретилась в тексте.
    • Автор:

      goblin
    • 4 года назад
    • 0
  • В данном случае ключи по значению совпадают с числами исходных последовательностей, а значения дают количество их повторов.
    • Автор:

      snakesxit
    • 4 года назад
    • 0
  • Кортеж (tuple) используется для представления последовательности разнородных объектов неизменяемой структуры. Вот пример кортежа: t = (2, 2.05, "Hello")
    • Автор:

      hawkins
    • 4 года назад
    • 0
  • Язык программирования не указан, сказано только, что была сделана попытка создать алгоритм в Пайтоне, но работа оказалась очень медленной. Это не удивительно, ведь Пайтон - интерпретатор и там уж не до оптимизации.Предлагаю решение на 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,y)).Zip(v3,(x,y)->Min(x,y)).Sum;  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 Гб оперативной памяти. Вполне приемлемо.
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years