Настройка:
Визуализируйте большой массив чисел, где каждое число представляет собой высоту полосы на гистограмме.
Пример: [5, 4, 3, 7, 2, 3, 1, 12]
█
█
█
█
█
█ █
█ █
█ █ █
██ █ █
████ █ █
██████ █
████████
Анализировать:
Это гистограмма предыдущих чисел. Мне нужно найти область, содержащуюся на графике в количестве открытых (или незаполненных) единиц.
Решение (Pt.1):
Чтобы обойти это, я сделал алгоритм для вычисления всех пиков в массиве.
Это возвращает: [5, 7, 3, 12]
, а также другой список с индексами каждой записи, [0,3,5,7]
Для нас есть только три важных пика. 5
, 7
и 12
.
Затем мы можем сломать это.
Количество открытой площади между 5 и 7 (общее правило):
(([Index Of Larger] - [Index Of Smaller] - [1])*[SmallerValue]) - [Values Of All In B/W]
Таким образом, площадь первого раздела будет (2*5) - (4+3)
или 10-7
или 3
. Это имеет смысл, потому что, если вы посмотрите на график, который вы видите, есть пустая секция L-образной формы, в которую вы могли бы поместить 3 единицы, например, воду без переполнения.
Если вы повторите это со второй секцией, вы также получите ее правильную область.
Моя проблема заключается в разработке алгоритма перехода от ALL PEAKS
к IMPORTANT PEAKS
.
Ложная:
В этом случае очень легко увидеть, как это можно сделать. Вы просто пишете алгоритм, чтобы узнать, что 3
меньше, чем 7
и 12
, поэтому избавитесь от него и верните уточненную версию пиков.
Однако это не всегда так просто.
Более сложный пример:
У меня есть массив:
[5, 4, 3, 7, 2, 3, 1, 12, 9, 10, 5, 3, 6, 8, 5, 6, 4, 7, 6, 9, 4, 11, 11, 4, 1, 2, 1]
Запуск через базовый алгоритм поиска пиков O(N)
Он возвращает:
[5, 7, 3, 12, 10, 8, 6, 7, 9, 11, 11, 4, 2]
В этом примере мы видим ту же проблему в первой части этого вопроса, однако, после 12
в этом списке пиков, человек может легко увидеть, что следующий наиболее важный пик, на который нужно обратить внимание, - это два 11s
, 4
и 2
. Поэтому мне нужно пройти путь:
[5, 7, 3, 12, 10, 8, 6, 7, 9, 11, 11, 4, 2]
To:
[5, 7, 12, 11, 11, 4, 2]
Вышеупомянутый массив представляет собой список "важных" пиков, необходимых для поиска области, и снова визуализировать открытые блоки, как если бы они содержали воду или что-то такое, что они ограничены самым низким ближайшим пиком до переполнения.
Чтобы лучше визуализировать этот более полный, второй пример, у меня есть изображение графика и всех его пиков и точек данных здесь.
Спасибо.