Самый частый элемент - Lisp
Формулировка задачи:
Не могу понять,как написать программу,которая читает трехмерный массив, содержащий вещественные числа, из стандартного потока ввода, и определяет, какое число встречается в массиве чаще всего, и выводит на экран количество вхождений.
Решение задачи: «Самый частый элемент»
textual
Листинг программы
(defun task-3 (a) (let ((la (array-dimensions a)) (v nil) (p nil) (al nil)) (dotimes (i (car la) t) (dotimes (j (cadr la) t) (dotimes (k (caddr la) t) (setf v (aref a i j k)) (setf p (assoc v al)) (if (null p) (push (cons v 1) al) (push (cons v (+ 1 (cdr p))) al))))) (apply #'max (mapcar #'cdr al))))
Объяснение кода листинга программы
В данном коде реализован алгоритм поиска самого частого элемента в массиве.
- Создается функция
task-3, которая принимает в качестве аргумента массивa. - В блок
letсоздаются следующие переменные:la- размеры массиваa.v- текущий элемент массиваa.p- ассоциативный массив, где ключами являются элементы массиваa, а значениями - их частота.al- список кортежей, содержащих элементы массиваaи их частоту.
- С помощью цикла
dotimesперебираются все индексы массиваa. - Внутри цикла
dotimesперебираются все индексы второго измерения массиваa. - Внутри цикла
dotimesперебираются все индексы третьего измерения массиваa. - Элемент массива
aс индексамиi,j,kприсваивается переменнойv. - Для этого элемента ищутся его предыдущие значения в переменной
p. Если такого элемента нет, то создается новый кортеж(v 1)и добавляется в конец спискаal. Если элемент уже есть, то к его частоте прибавляется единица и создается новый кортеж(v (+ 1 (cdr p)), который добавляется в конец спискаal. - После завершения третьего цикла
dotimes, в переменнойalбудет список кортежей, содержащих элементы массиваaи их частоту. - С помощью функции
applyи функцииmaxнаходится максимальное значение в списке кортежейal. - Результатом работы функции
task-3будет самый частый элемент массиваa.