Tìm kiếm trong mảng được sắp xếp xoay vòng Java

Trước khi được chuyển đến chức năng của bạn, nums được xoay ở một chỉ số trục không xác định k [0 & a, int target] { return find[a.begin[], a.end[], target] == a.end[] ? -1 : find[a.begin[], a.end[], target] - a.begin[]; }

Mã Java

public static int findInArray[int[] a, int target] {
  int found = -1;
  for [int i = 0; i < a.length; i++] {
    if [a[i] == target] {
      found = i;
      break;
    }
  }
  return found;
}

Mã Python

def findInArray[a, target]:
    for i in range[len[a]]:
        if a[i] == target:
            return i
    return -1

Phân tích độ phức tạp

  • Thời gian phức tạp. Trên]
  • Độ phức tạp không gian. Ô[1]

Cách tiếp cận tối ưu [Với tìm kiếm nhị phân]

Chúng tôi có thể giải quyết vấn đề này một cách tối ưu với một Tìm kiếm nhị phân đệ quy duy nhất. Thuật toán được thực hiện như sau

  • Khởi tạo hàm đệ quy với 2 con trỏ left = 0, right = n – 1
  • Tìm phần giữa của dải mid = [trái + phải] / 2
  • Nếu phạm vi [trái, giữa] được sắp xếp,
    • Nếu mục tiêu nằm trong phạm vi đó, hãy đệ quy chuyển đến phạm vi [trái, giữa]
    • Khác đi đến phạm vi [giữa + 1, phải]
  • Khác, chúng tôi chuyển đến phạm vi [giữa + 1, bên phải] [vì nó phải được sắp xếp],
    • Nếu mục tiêu nằm trong phạm vi, hãy đệ quy chuyển đến phạm vi [giữa + 1, phải]
    • Khác đi đến phạm vi [trái, giữa].  

Thực hiện

Mã C++

int findInArray[vector < int > & a, int left, int right, int target] {
  if [left > right] {
    return -1;
  }
  int mid = [left + right] / 2;
  if [a[mid] == target] {
    return mid;
  }
  if [a[mid] >= a[left]] {
    if [target >= a[left] && target <= a[mid]] {
      return findInArray[a, left, mid - 1, target];
    } else {
      return findInArray[a, mid + 1, right, target];
    }
  } else {
    if [target >= a[mid] && target <= a[right]] {
      return findInArray[a, mid + 1, right, target];
    } else {
      return findInArray[a, left, mid - 1, target];
    }
  }
}

Mã Java

public static int findInArray[int[] a, int left, int right, int target] {
  if [left > right] {
    return -1;
  }
  int mid = [left + right] / 2;
  if [a[mid] == target] {
    return mid;
  }
  if [a[mid] >= a[left]] {
    if [target >= a[left] && target <= a[mid]] {
      return findInArray[a, left, mid - 1, target];
    } else {
      return findInArray[a, mid + 1, right, target];
    }
  } else {
    if [target >= a[mid] && target <= a[right]] {
      return findInArray[a, mid + 1, right, target];
    } else {
      return findInArray[a, left, mid - 1, target];
    }
  }
}

Mã Python

def findInArray[a, left, right, target]:
    if left > right:
        return -1
    mid = [left + right] // 2
    if a[mid] == target:
        return mid
    if a[mid] >= a[left]:
        if target >= a[left] and target <= a[mid]:
            return findInArray[a, left, mid - 1, target]
        else:
            return findInArray[a, mid + 1, right, target]
    else:
        if target >= a[mid] and target <= a[right]:
            return findInArray[a, mid + 1, right, target]
        else:
            return findInArray[a, left, mid - 1, target]

Phân tích độ phức tạp

  • Thời gian phức tạp. O[log2n]
  • Độ phức tạp không gian. Ô[1]

Vấn đề thực hành

Tìm kiếm mảng được sắp xếp xoay

câu hỏi thường gặp

1. Phương pháp tìm kiếm nhị phân có hoạt động không nếu mảng có các phần tử trùng lặp?

A. Cách tiếp cận sẽ không hoạt động nếu mảng có các phần tử trùng lặp vì chúng tôi sẽ không thể quyết định nên lặp lại cho nửa bên trái hay bên phải, trong trường hợp xảy ra trùng lặp

2. Các trường hợp cơ sở cho phương pháp đệ quy này là gì?

A. Nếu con trỏ bên trái vượt quá con trỏ bên phải, hàm trả về -1. Ngoài ra, nếu phần tử hiện tại, bằng phần tử đích, chúng tôi trả về chỉ mục của phần tử này. Đây là những trường hợp cơ bản của đệ quy

Bạn sẽ tìm kiếm như thế nào trong danh sách được sắp xếp xoay vòng?

Bạn phải viết thuật toán với độ phức tạp thời gian chạy O[log n]. .
ví dụ 1. Đầu vào. nums = [4,5,6,7,0,1,2], mục tiêu = 0. 4
ví dụ 2. Đầu vào. nums = [4,5,6,7,0,1,2], mục tiêu = 3 Đầu ra. -1
ví dụ 3. Đầu vào. nums = [1], target = 0 Đầu ra. -1

Cách nhanh nhất để tìm kiếm một mảng được sắp xếp là gì?

Một cách nhanh chóng để tìm kiếm một mảng đã sắp xếp là sử dụng tìm kiếm nhị phân . Ý tưởng là nhìn vào phần tử ở giữa. Nếu khóa bằng đó, quá trình tìm kiếm kết thúc. Nếu khóa nhỏ hơn phần tử ở giữa, hãy thực hiện tìm kiếm nhị phân trên nửa đầu.

Độ phức tạp về thời gian của việc tìm một số trong một mảng được sắp xếp xoay là bao nhiêu?

Tìm kiếm mảng được sắp xếp xoay vòng . Nếu tìm thấy trong mảng trả về chỉ số của nó, nếu không trả về -1. Bạn có thể cho rằng không có bản sao nào tồn tại trong mảng. Độ phức tạp thời gian chạy của thuật toán của bạn phải theo thứ tự O[log n] .

Thuật toán nào có thể được sử dụng để tìm một phần tử trong một mảng đã được sắp xếp?

Trong khoa học máy tính, tìm kiếm nhị phân , còn được gọi là tìm kiếm nửa khoảng, tìm kiếm logarit hoặc cắt nhị phân, là một thuật toán tìm kiếm . Tìm kiếm nhị phân so sánh giá trị đích với phần tử ở giữa của mảng.

Chủ Đề