Анализ временной сложности задачи оптимального матричного поиска (2D)

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

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

Тем не менее, я публикую это, чтобы мы могли начать обсуждение.

Первое первым:

Проблема заключается в следующем:

Напишите эффективный алгоритм, который ищет значение в таблице размера n x m (двумерный >массив). Эта таблица отсортирована по строкам и столбцам, т. е.

Таблица[i][j] ≤ Таблица[i][j + 1] Таблица[i][j] ≤ Таблица[i + 1][j].

Здесь следует отметить, что все строки и столбцы сортируются монотонно, т. е. все строки и столбцы сортируются в неубывающем (лексикографическом) порядке.

Чтобы узнать о реальной проблеме и приятном обсуждении этой проблемы, нажмите на следующую ссылку:

Примечание: этот пост состоит из частей 1, 2 и 3.

Поиск в 2D-матрице

Хонг Шен из Университета Гриффита, Австралия, 27 декабря 1995 г. опубликовал оптимальное решение этой задачи, равное O(mlog(2n/m)) для последовательного алгоритма.

Hong Shen-- Обобщенная Оптимальная матрица Поиск < /а>

С тех пор по этому поводу было сделано множество дискуссий на форумах, в блогах, а также онлайн и офлайн статей и публикаций, но на сегодняшний день, насколько мне известно, O(((log(n))2) является наиболее востребованным на эту статью с Улучшенным бинарным поиском.

Даже при том, что подробный алгоритм не был предоставлен.

Теперь я сделал различные варианты решения этой проблемы в надежде, что оптимальное решение будет ниже, чем текущее лучшее (я думаю)

Однако я не так хорош в анализе временных сложностей алгоритмов.

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

Вот вам первый анализ временной сложности

  /*  NIAZ MOHAMMAD

    IntPol2d.cpp

    1. Find the interpolated mid along column
    2. Compare key with each elements in row-wise 
       along the found mid column
    3. IF failed
        DO 
        RECURSIVE call to IntPol2d 
        a. IF(key > a[row][mid])
            THEN SET l = mid + 1 and d = row - 1;
        b. ELSE set r = mid -1 and u = row;
*/


    bool intPol2d(int mat[][6], int M, int N, int target, int l, int u, int r, int d, int &targetRow, int &targetCol,int &count) {
      count++;
      if (l > r || u > d) return false;

      if (target < mat[u][l] || target > mat[d][r]) return false;

      int mid = l + ((target - mat[u][l])*(r-l))/(mat[d][r]-mat[u][l]);
      int row = u;

      while (row <= d && mat[row][mid] <= target) 
      {
        if (mat[row][mid] == target) 
        {
          targetRow = row;
          targetCol = mid;
          return true;
        }
        row++;
      }
      return intPol2d(mat, M, N, target, mid+1, u, r, row-1, targetRow, targetCol,count) ||
             intPol2d(mat, M, N, target, l, row, mid-1, d, targetRow, targetCol,count);

    }

Если вам нужен весь исполняемый код, сообщите мне.

Спасибо за ваше терпение и помощь и увидимся на доске обсуждений:

Примечание: @ Администраторы или модераторы, дайте мне знать, если это не подходящее место для такого длинного вопроса, тогда я перейду в свой блог.


person Niaz Mohammad    schedule 19.06.2011    source источник
comment
Что означает O(((log(n))2) и почему он не включает m? Как вы думаете, какова сложность вашего кода? Если вы не можете анализировать сложность, что дает вам такую ​​уверенность, что вы можете побить Хонг Шена? Почему ты пропускаешь M и N и никогда их не используешь?   -  person Beta    schedule 19.06.2011
comment
1. Этот заявлен по ссылке, предоставленной Поиск 2D-матрицы, и в этом случае он предположил, что это квадратная матрица.   -  person Niaz Mohammad    schedule 19.06.2011
comment
Вы новичок? Тогда вы пытаетесь решить проблему, выходящую за рамки ваших навыков (и просите нас сделать эту работу). Начните с чего-нибудь попроще, например, с базовых алгоритмов поиска и сортировки. Как только вы освоите их, вы будете лучше подготовлены к решению подобных проблем.   -  person Beta    schedule 19.06.2011


Ответы (1)


вам не нужно рассматривать массив как двумерную вещь. Это просто mat[n], где n=MxN и выполнение бинарного поиска со сложностью O(log(n)). обратите внимание, что это логарифмическая база 2 и это худший случай. Обратите внимание, что комплексность не включает константы, отличные от 1, потому что они не меняются с размером ввода. Фактический худший случай - это 2 * log (n) проверенных элементов. Кроме того, вы можете попасть в тот, который хотите, в первом тесте. Вы не сможете работать быстрее без предварительной сборки хеш-таблицы или другого ассоциативного массива, в котором указатель на элемент в исходной матрице, который вы ищете, находится в индексе в новом массиве. Вам нужен элемент со значением 46, поэтому вы ищете в своей таблице индексов элемент с индексом 46, который, скажем, указывает на (M,N)=(2357,656). Бум, сложность O(1) после того, как построена многоразовая индексная таблица с большими затратами памяти.

person MartyTPS    schedule 17.10.2011
comment
Нет, мы не можем просто сгладить массив, элементы не сортируются таким образом. Мы знаем только, что для каждого элемента его восточный и южный сосед больше его. Таким образом, вполне возможна матрица типа [ 1 4 6 ][ 2 7 8] [ 5 8 9 ], которая будет [ 1 4 6 2 7 8 5 8 9 ]. Это действительно интересная и забавная задача. - person SáT; 17.10.2011
comment
ах... что то я не уловил. Сколько поисковых запросов на матрицу? Другими словами, возможны ли алгоритмы с дорогостоящей однократной подготовкой и дешевыми повторными поисками? - person MartyTPS; 18.10.2011
comment
поэтому бинарный поиск для поиска подмножества строк, которые начинаются меньше или равны, а затем итеративный поиск в этом подмножестве, чтобы найти подмножество, последний элемент которого больше или равен, а затем двоичный поиск внутри этого подмножества подмножества, чтобы найти столбец в строке (все их, если вам нужны все совпадения, или первое совпадение, если вам нужно только одно). - person MartyTPS; 18.10.2011
comment
в худшем случае будет что-то вроде: 2*log(n)*n*2*log(3) -> O(n*log(n)) - person MartyTPS; 18.10.2011
comment
Есть лучше. Вот другое обсуждение проблемы в stackoverflow с классическим O (н) решение. Если вы хотите открыть его сами, вот подсказка: рассмотрите особые свойства северо-восточных и юго-западных элементов. - person SáT; 18.10.2011
comment
Да, я знаю, что наилучший наихудший случай, достигнутый на данный момент, - это O (n), однако я пытаюсь понять, можно ли сделать лучше, чем это... Поскольку я НЕ так хорош в его анализе, Мне нужна помощь от кого-то, чтобы помочь мне понять tc моего предоставленного сегмента кода. Спасибо - person Niaz Mohammad; 07.07.2012