cuốn sách gpt4 ai đã làm

arrays - 找出数组中满足 ia[j] 的 (i,j) 对的总数

In lại Tác giả: Taklimakan 更新时间:2023-11-03 02:35:35 30 4
mua khóa gpt4 Nike

如问题中所述,需要找到数组中 (i,j) 对的总数,使得

(1) **i
(2) **a[i]>a[j]**

其中 i 和 j 是数组的索引。没有空间限制。

câu hỏi của tôi là

 1) Is there any approach which takes less than O(N^2) time?
2) if so what is least complexity ?
3) How do we prove that ?

我希望我对这个问题很清楚。

我的做法如下

做这道题的一种方法是使用暴力破解,这需要 O(N^2) 时间。

但我认为这个问题应该有一个更好的优化解决方案——至少O(NlogN)的解决方案。我的直觉原因如下

直觉 1) Để sắp xếp một mảng theo điều kiện thứ tự tăng dần, chúng ta có: for i

Bản năng thứ hai của tôi là:

Giả sử chúng ta có một mảng các phần tử như sau: 4,9,7,3,2,1,8,12

Chúng tôi tính toán các điều kiện trêntôia[j]Đối với phần tử 4, khi i=0 trỏ đến 4 thì các giá trị có thể có của j là 3,4,5. Vì a[0]>a[3],a[0]>a[4],a[0]> a[5] nên tổng số cặp (i,j) hiện tại của tôi là 3. Lần tới khi tôi tăng i(index) lên 1 thì các giá trị có thể có của j là 2,3,4,5,6. Nhưng chúng ta nên sử dụng thực tế là khi i=0 (khi a[i]=4), chúng ta đếm 3 phần tử nhỏ hơn a[i=0], do đó a[i=0] nhỏ hơn a[ i=1], vì vậy tôi không 'không so sánh 9 với 3,2,1 (loại bỏ các phép tính không cần thiết). Nếu loại bỏ được các phép tính không cần thiết thì chúng ta có thể giảm độ phức tạp xuống nhỏ hơn O(N^2), nếu không thì không có nghiệm nào nhỏ hơn O(N^2). Nhưng nếu có giải pháp thì chúng ta sẽ làm gì với nó. Tôi đã thử vẽ sơ đồ nhưng nỗ lực của tôi đều vô ích.

Cách 1) Để đạt được độ phức tạp O(nlogn), tôi nghĩ chúng ta cần điều chỉnh cách sắp xếp nhanh hoặc sắp xếp hợp nhất để có được giải pháp nhưng vấn đề ở đây là, nếu chúng ta sắp xếp mảng, chúng ta sẽ mất vị trí thực tế của các phần tử.

phương pháp 2) Để có được giải pháp trong thời gian O(NlogN), tôi nghĩ rằng bằng cách sử dụng cây, chúng tôi có thể nhận được giải pháp tối ưu hóa. Tôi không nhận được bất kỳ manh mối nào.

Cách 3) Nếu tồn tại bất kỳ thuật toán thời gian O(N) nào thì nó phải được băm. Nhưng trong trường hợp này, phép băm đơn giản không hoạt động.

Vì vậy, vui lòng cho tôi biết trực giác hoặc cách tiếp cận nào ở trên là đúng (và nếu đúng thì cách tiếp cận nào sẽ dẫn đến giải pháp tối ưu hóa và bằng cách nào).

câu trả lời hay nhất

Bạn có thể sử dụng thuật toán này để tính toán các cặp đảo ngược, tương tự như sắp xếp hợp nhất, như đã giải thích đây .

Ý tưởng là hợp nhất sắp xếp mảng trong khi đếm số lượng đảo ngược đã được thay đổi ở mỗi bước.


Một cách tiếp cận khác là sử dụng cây thống kê đơn hàng. Bạn chèn các phần tử của mảng vào cây này theo thứ tự và sau mỗi lần chèn xem có bao nhiêu phần tử lớn hơn phần tử được chèn trước nó.

Một giải pháp thay thế cho cây thống kê thứ tự là Danh sách bỏ qua có thể lập chỉ mục .


Độ phức tạp về thời gian của cả hai thuật toán là O(N log N).

Để có được số lần đảo ngược gần đúng, độ phức tạp về thời gian O(N) là có thể, với một số hạn chế. chúng ta có thể sửa đổiSắp xếp nhómSửa đổi sắp xếp hợp nhất theo cách tương tự.

Trong giai đoạn "phân tán" của sắp xếp nhóm, chúng ta nên ước tính số phần tử trong nhóm cho các phần tử lớn hơn trong khi chèn các phần tử vào cuối một nhóm nhất định (các phần tử trong mỗi nhóm giữ nguyên thứ tự ban đầu của chúng).

Trong giai đoạn "sắp xếp" của sắp xếp nhóm, chúng ta nên sửa đổi (theo cách tương tự) thuật toán sắp xếp (rất có thể là sắp xếp chèn). Trong khi chèn một phần tử vào vị trí thích hợp, chúng ta nên đếm xem nó đã bỏ qua bao nhiêu phần tử khác.

Về hạn chế, thuật toán chỉ hoạt động với các số (hoặc đối tượng, dễ chuyển đổi thành số) và chúng ta nên biết trước các số đó được phân phối như thế nào. Vì vậy, nếu chúng ta có một dãy số nguyên phân bố đồng đều, thuật toán này sẽ hoạt động tốt.

Về mảng - tìm tổng số cặp (i,j) trong một mảng thỏa mãn ia[j], chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/13158439/

30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress