Поиск наибольшего и наименьшего значений с наибольшим количеством отсчетов в гистограмме

Я создал программу для создания текстовой гистограммы из изображения.
Теперь мне нужно взять данные из текстового файла и найти наибольшее значение с наибольшим количеством счетчиков и наименьшее значение с наибольшим количеством счетчиков.
Это пример из сгенерированного текстового файла:

0 1 
1000 80 
10004 2 
10005 200 
10006 2  
1002 73 
105 10

Слева я перечислил значения пикселей, а с другой стороны количество.

Итак, здесь я получаю значение 10005 как наибольшее с наибольшим количеством (200) и значение 1000 как наименьшее с наибольшим числом (80).

Я знаю, как читать текстовый файл построчно, разделять значения и помещать их в массив.
Вопрос в том, как я могу получить то, что хочу, самым быстрым способом, предполагая, что я работаю с большими изображениями, генерирующими длинные списки значений (сотни) в текстовых файлах гистограммы?

Почему 1000 (80) не является самым маленьким из самых высоких?

Mary 10.02.2019 09:08

Вы правы, спасибо! Я был больше сосредоточен на вопросе, чем на списке, когда писал его.

qrppablo 10.02.2019 16:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определение минимального и максимального значения здесь несколько противоречиво, но, следуя описанию, основная логика может заключаться в том, что минимум может быть определен, когда найден максимум.

Таким образом, мы можем упорядочить список (несколько сотен строк данных — это немного) по убыванию (сначала более высокие значения), оценить максимальное значение и после этого определить минимальное:

Dim bitmapData = File.ReadAllLines("[Data File Path]").
                    Select(Function(bd) bd.Split(New String() {" "c}, StringSplitOptions.RemoveEmptyEntries).
                    Select(Function(n) Integer.Parse(n)).ToArray()).
                    OrderByDescending(Function(value) value(0)).ToList()


Dim max() As Integer = bitmapData(0)
Dim min() As Integer = {bitmapData(0)(0), 0}

For i As Integer = 1 To bitmapData.Count - 1
    If bitmapData(i)(1) > max(1) Then
        If bitmapData(i + 1)(0) < bitmapData(i)(0) Then
            max = bitmapData(i)
        End If
    ElseIf bitmapData(i)(0) < max(0) Then
        If bitmapData(i)(1) >= min(1) Then
            min = bitmapData(i)
        End If
    End If
Next

Используя вашу выборку данных и сравнительный массив значений, вы получите следующие результаты:

Min ( 1030, 251)     Min ( 1000,  80)
Max (10001, 260)     Max (10005, 200)
--------------------------------------------
      0   1                0   1 
  10001 260             1000  80 
   1000  80            10004   2 
  10004   2            10005 200 
  10005 200            10006   2  
  10006   2             1002  73 
   1002  73              105  10
    105  10
     50 250
     51 220
   1026 201
   1030 251
   1031 250
  10009 252
  10008 250
  10007 251

Предполагая, что источник данных представлен двумя разными массивами (с именами Pixels и Counts, здесь), которые должны быть синхронизированный (парные индексированные значения), вам просто нужно заменить массив BitmapData массивом Pixels и Counts:

Dim Pixels As Integer() = [Integer Source]
Dim Counts As Integer() = [Integer Source]

Dim max() As Integer = {Pixels(0), Counts(0)}
Dim min() As Integer = {Pixels(0), 0}

For i As Integer = 1 To Pixels.Count - 1
    If Counts(i) > max(1) Then
        If Pixels(i + 1) < Pixels(i) Then
            max = {Pixels(i), Counts(i)}
        End If
    ElseIf Pixels(i) < max(0) Then
        If Counts(i) >= min(1) Then
            min = {Pixels(i), Counts(i)}
        End If
    End If
Next

Спасибо, это работает! и как я могу сделать то же самое, но взять значения из двух целочисленных массивов, один из которых содержит значения пикселей, а другой - счетчики? не читает текстовый файл.

qrppablo 11.02.2019 08:28

Это не работает для меня. У меня есть массив пикселей и парные значения массива. Например: Counts(0) соответствует Pixels(0) и т. д., но в первом коде, который вы разместили, вы использовали функцию OrderByDescending, и ее здесь не существует, и когда я читаю максимальное значение, она выдает мне " 0», потому что это первое число в массиве пикселей (индекс 0), и оно не по порядку. Я уже объявлял эти массивы, и я не понимаю, почему вы ставите [Integer Source] в объявлении, у меня выдает ошибку, плюс я должен изменить bitmapData.Count на Pixels.Count в цикле.

qrppablo 11.02.2019 22:46
Dim Pixels As Integer() = [Integer Source] означает, что массив Pixels заполнен любым источником, который вы используете. То же самое для массива Count. Если у вас уже есть массив Pixels (с любым именем), используйте его. bitmapData бесполезен, если у вас уже есть 2 массива. Используйте только второй фрагмент кода, где вы предоставляете массивы Pixels и Count. Порядок здесь не имеет значения.
Jimi 11.02.2019 22:57

Другие вопросы по теме