Làm thế nào để phát triển thuật toán giải bài toán 2 tổng?


8

Cho một mảng các số nguyên được sắp xếp, tôi muốn tìm số cặp có tổng bằng . Ví dụ: đã cho , số lượng cặp tổng bằng 0 là .{ - 3 , - 2 , 0 , 2 , 3 , 4 } 20{3,2,0,2,3,4}2

Gọi là số phần tử trong mảng đầu vào. Nếu tôi sử dụng tìm kiếm nhị phân để tìm nghịch đảo phụ gia cho một phần tử trong mảng, thứ tự là . Nếu tôi duyệt qua tất cả các phần tử trong tập hợp, thì thứ tự là .O ( log N ) O ( N log N )NO(logN)O(NlogN)

Làm thế nào để tìm một thuật toán có thứ tự ?O(N)


2
Các vấn đề -SUM thường đề cập một vấn đề hơi khác nhau, nơi người ta cố gắng để tìm một tập hợp các yếu tố từ đầu vào mảng như vậy mà họ tổng bằng không. Trong một mô hình tính toán nhất định, không thể có được thuật toán thời gian tuyến tính cho hoặc cho bất kỳ chẵn nào . Xem câu hỏi này . k A k = 2 kkkAk=2k
Juho

Câu trả lời:


12

Đặt là mảng đầu vào được sắp xếp. Giữ hai con trỏ và mà đi qua các yếu tố trong . Con trỏ sẽ đi qua "phần bên trái" của , đó là các số nguyên âm. Con trỏ thực hiện tương tự cho "phần bên phải", các số nguyên dương. Dưới đây, tôi sẽ phác thảo một giải pháp mã giả và giả sử rằng cho đơn giản nhỏ. Bỏ qua cũng là những kiểm tra cho các trường hợp có chỉ tích cực hay chỉ số nguyên âm trong .l r A l A r 0 A AAlrAlAr0AA

COUNT-PAIRS(A[1..N]):
 l = index of the last negative integer in A
 r = index of the first positive integer in A
 count = 0;

 while(l >= 0 and r <= N)
   if(A[l] + A[r] == 0)
     ++count; ++right; --left; continue;

   if(A[r] > -1 * A[l]) 
     --left;
   else 
     ++right;

Rõ ràng là thuật toán mất thời gian .O(N)


3
Bạn có lẽ nên thêm một đối số cho chính xác.
Raphael

-1

Theo cách hiểu đơn giản nhất, theo cách hiểu của tôi, dường như là sử dụng Bảng băm, H = {a [0] = true, .., a [n-1] = true}. Bảng Hash này có thể được xây dựng trong thời gian O (n). Khi Bảng Hash được tạo, lặp qua A [0, .., n-1] và kiểm tra xem H [-1 * a [i]] có tồn tại không. Nếu có, tăng một bộ đếm lên 1 và trả về kết quả cuối cùng. Đây rõ ràng là O (n).


3
Các biểu thức H = {a [0] = true, .., a [n-1] = true} và A [0, .., n-1] không có ý nghĩa gì với tôi. Khi sử dụng hàm băm, mảng thậm chí không được sắp xếp. Nhưng các thuật toán sử dụng hàm băm sử dụng một số thuộc tính giả của hàm băm. Trong trường hợp xấu nhất, tất cả các mục sẽ ánh xạ tới cùng một giá trị băm và thuật toán là bậc hai. Tôi không biết các yêu cầu của OP là gì.
phép lạ173

Xem triển khai của tôi dưới đây và cho tôi biết làm thế nào nó là bậc hai trong trường hợp xấu nhất.
sammy

@ miracle173: Đó chỉ là sự tiện lợi cho ký hiệu. Tôi có thể biểu diễn Bảng Hash dưới dạng một tập hợp các cặp Khóa-Giá trị (đó là những gì nó thực sự là, nói một cách toán học). Sự sắp xếp thực tế trong bộ nhớ là không cần thiết cho các chi tiết lý thuyết liên quan đến sự phức tạp. Và, các hàm Hash được thiết kế để tránh va chạm được cung cấp đủ entropy hạt giống. Tôi đã trả lời với câu trả lời vì câu trả lời của Juho giả sử "sắp xếp A", điều này ngầm làm cho độ phức tạp O (n log (n)) và * KHÔNG O (n).
Juspreet Sandhu

@ manbearpig1 Người dùng Evil đã thêm một bình luận vào bài đăng của bạn để trả lời câu hỏi của bạn. Trường hợp xấu nhất của tra cứu bảng băm là O (n) và do đó trường hợp xấu nhất của toàn bộ thuật toán là O (n ^ 2).
phép lạ173

@JuspreetSandhu Usere Evil đã thêm một nhận xét cho một câu trả lời khác giải thích vấn đề với hàm băm.
phép lạ173

-1

Lưu ý rằng chúng ta có thể tra cứu một giá trị trong bộ Python trong thời gian không đổi.

def twoSum(data):
    count = 0
    nums = set()
    for num in data:
        if (num * -1) in nums:
            count += 1
        nums.add(num)
    return count

1
Đó không phải là thời gian không đổi mà là thời gian không đổi dự kiến. Có thể có bảng băm, cây (tự) cân bằng hoặc cấu trúc tương tự. Điều này mang lại dự kiến nhưng có thể là trong trường hợp xuống cấp cho bảng băm hoặc cho cây. Bên cạnh đó ở đây, chúng tôi thích mã giả vì không phải ai cũng hiểu trăn, vì vậy không rõ tại sao hoặc làm thế nào nó hoạt động. Trong trường hợp xấu nhất đối với bảng băm trong đó mọi giá trị được ánh xạ vào một thùng, thời gian để lấy phần tử là . Bạn thực hiện bước này lần để nó cho trong trường hợp xấu nhất. O ( n ) O ( log n ) O ( n ) n O ( n 2 )O(1)O(n)O(logn)O(n)nO(n2)
Ác
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.