【问题标题】:Search in a row wise and column wise sorted matrix [duplicate]在逐行和逐列排序矩阵中搜索[重复]
【发布时间】:2017-09-02 04:30:43
【问题描述】:

我们有一个 n x n 矩阵,其中每一行和每一列都按升序排序。

给定一个数x,如何判断这个x是否在矩阵中,优于O(n)复杂度?

【问题讨论】:

  • 优于 O(n) 复杂度?我认为不可能。
  • 你试过什么不起作用?
  • @Gene 我只需按行和列搜索就可以做到 O(n)。
  • @Toussaint Louverture 该方法是 O(N2),因为对于 nXn 矩阵,行 =n 和列 = n。对于每一行,您遍历 n 列元素。
  • @nits.kk 但这些都是 O(n) 解决方案。他要求比 O(n) 更好。

标签: algorithm performance search


【解决方案1】:

我认为只使用二进制搜索。

二分查找的时间复杂度为 O(log(n))。

因此,在 n x n 矩阵的情况下,时间复杂度为 O(log(n^2)) = O(2log(n))。

比 O(n) 好。

-----(编辑)/这是我的 cpp 代码。

#include<vector>
#include<iostream>
#include<cstdio>

using namespace std;

int n = 10;
vector<vector<int> > arr;
int search_cnt;

int _1to2(int x)
{
    int row, col;

    row = (x - 1) / n + 1;
    if(x % n == 0)
        col = n;
    else
        col = x % n;

    return arr[row][col];
}

int _2to1(int row, int col)
{
    return (row - 1) * n + col;
}

int binary(int find)
{
    int low = 1, high = n*n, mid;

    while(low <= high)
    {
        search_cnt++;
        mid = (low + high) / 2;
        if(_1to2(mid) > find)
            high = mid - 1;
        else if(_1to2(mid) < find)
            low = mid + 1;
        else
        {
            printf("search_cnt = %d, ", search_cnt);
            return mid;
        }
    }

    return -1;
}

int main()
{
    int cnt = 1;
    search_cnt = 0;

    arr.resize(n+1);
    for(int i = 0; i <= n; i++)
        arr[i].resize(n+1);

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            arr[i][j] = cnt++;

    for(int i = 1; i <= n*n; i++)
    {   
        printf("searching pos = %d \n", binary(i));
        search_cnt = 0;
    }

    return 0;
}

【讨论】:

  • 二进制搜索适用于总订单。具有已排序行和列的二维数组不是完全有序的。你打算如何使用二分搜索?我想看看伪代码。
  • 如果矩阵按行到列排序并且矩阵单元格开始 (1,1),我可以认为每个单元格 (arr[y][x]) 是一维数组 (arr[p], p = (x - 1) * n + y )。
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多