Tìm số lượng phần tử nhỏ hơn cho mỗi phần tử trong một mảng một cách hiệu quả


9

Tôi bị mắc kẹt trong vấn đề này:

Cho một mảng trong số số tự nhiên đầu tiên được hoán vị ngẫu nhiên, một mảng được xây dựng, sao cho là số phần tử từ đến nhỏ hơn . n B B ( k ) A ( 1 )AnBB(k)A(1)A ( k )A(k1)A(k)

i) Cho bạn có thể tìm thấy trong thời gian không? ii) Cho bạn có thể tìm thấy trong thời gian không?B O ( n ) B A O ( n )ABO(n)
BAO(n)

Ở đây, . Để biết ví dụ cụ thể: | A 8 4 3 1 7 2 9 6 5 B 0 0 0 0 3 1 6 4 4 |B(1)=0

|A843172965B000031644|

Ai giúp tôi với? Cảm ơn.


Tôi đã tìm thấy điều này: Tính toán mã hóa hoán vị cung cấp thuật toán cho các vấn đề này. Ít nhất tôi nghĩ rằng họ là những vấn đề tương tự. O(nlogn)
Realz Slaw

@Merbs điều đó Gợi ý bạn đưa ra có nghĩa là bạn có giải pháp?
AJed

1
@AJed, điều đó có nghĩa là tôi có một thuật toán, mặc dù phải mất cho thuật toán đơn giản không có khoảng trắng và nếu chúng ta được phép có không gian. Hiện tại, tôi đang nghiêng về phía không phải là không thể trong và cả hai đều là cùng một thuật toán. O ( n log n ) O ( n )O(n2)O(nlogn)O(n)
Merbs

@Merbs. Tôi cảm thấy gợi ý của bạn có thể dẫn đến theo dõi đúng. tôi cũng có một giải pháp (theo gợi ý của bạn). Tôi đoán có một mẹo trong phân tích khiến nó đi đến .. Tôi nghĩ rằng mẹo đó là kiến ​​thức mà đi từ 1: . A nO(n)An
AJed

2
Bài viết này cũng đưa ra thuật toán . Bạn có chắc chắn tồn tại thuật toán cho việc này không? O ( n )O(nlogn)O(n)
Realz Slaw

Câu trả lời:


1

Thuật toán ngây thơ để xác định từ :ABA

Với , hãy xác định giá trị của bằng cách so sánh từng với với và đếm những giá trị thỏa mãn .k=1,,nB(k)A(i)A(k)i=1,,kA(i)<A(k)

Thuật toán này so sánh với tất cả những người khác ( lần), với người khác, v.v. vì vậy tổng số so sánh là . Nhưng đó không phải là điều tốt nhất chúng ta có thể làm. Ví dụ, nhìn vào , chúng ta không cần phải so sánh! vì đó là số tự nhiên đầu tiên và được đảm bảo (không phụ thuộc vào hoán vị) rằng các số tự nhiên thấp hơn sẽ ở đó. Còn thì sao? Thay vì kiểm tra đến , chúng ta chỉ có thể kiểm tra . Đó là:A(1)n1A(2)n2(n1)(n2)2B(n)B(n)=A(n)1 nn1B(n1)A(1)A(n2)A(n)

Với , sử dụng thuật toán ở trên; với sử dụng thuật toán ngược: xác định bằng cách đặt ban đầu thành và sau đó trừ cho mỗi mục cho nhỏ hơn .k=1,,n2k=n2,,nB(k)A(n)11A(i)i=k+1,,nA(k)

Điều này sẽ mất bước, vẫn là . Cũng lưu ý rằng khi xây dựng từ , nếu thì .2×(n21)(n22)2=(n2)(n4)4O(n2)ABB(n)=A(n)1A(n)=B(n)+1

Nhưng bây giờ cho tinh tế hơn. Nếu chúng tôi cho phép một số không gian bổ sung hoặc sắp xếp tại chỗ, chúng tôi có thể sắp xếp các số khi chúng tôi so sánh chúng. Ví dụ:

|A843172965S987432165B0000316|

Thay vì kiểm tra tất cả chúng (hoặc kiểm tra chúng theo thứ tự), chúng tôi có thể sử dụng tìm kiếm nhị phân để xác định từng . Tuy nhiên, việc sắp xếp vẫn mất thời gian .B(k)O(nlogn)


Đây chỉ là ý tưởng đầu tiên của tôi; mặc dù tôi nhận ra vấn đề này thú vị hơn ban đầu tôi đã cho nó tín dụng. Và tôi chưa có cơ hội để đọc những phát hiện của Realz Slaw, vì vậy thuật toán có thể bị tắt.
Merbs

0

Thay vì xác định từng một lần, chúng ta có thể chuyển tiếp tìm kiếm và chỉ đi qua từng số trong một lần ! Nhưng chúng ta sẽ sử dụng space:B(k)A n

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

Chúng tôi có thể tiết kiệm nhiều thời gian hơn bằng cách không cập nhật những thứ đã được xác định (nghĩa là không có điểm nào trong việc cập nhật sau bước đầu tiên), nhưng trong trường hợp xấu nhất, chúng tôi vẫn phải cập nhật lần8(n)(n+2)2


0

cả I và II đều có thể giải được bằng cách sử dụng #next_g [_element mà tôi đã giải thích ở đây . nhưng nó khó hơn một chút so với chỉ vấn đề nhưng trước khi có giải pháp, bạn cần tìm hiểu yếu tố lớn hơn tiếp theo:

  1. xem xét chúng ta có một vectơ cho mọi phần tử của tên nó là cho phần tử . bây giờ một lần chạy thuật toán lớn hơn tiếp theo bắt đầu từ phải sang trái nhưng ngoại trừ cài đặt phần tử trong chỉ số phần tử lớn hơn tiếp theo của nó, ấn vào các phần tử mà là phần tử lớn hơn tiếp theo của chúng. Sau đó lặp qua mảng từ trái sang phải và sau đó trong đó là kích thước của vectơ và nó vì mỗi thuật toán lớn hơn tiếp theo là và cũng lặp đi lặp lại làS i i i A S i i B [ i ] = x j = 0 ( S i [ j ] + 1 ) x S i Θ ( n ) Θ ( n ) Θ ( n )ASiiiASiiB[i]=j=0x(Si[j]+1)xSiΘ(n)Θ(n)Θ(n)

Phần thứ hai cũng lưu ý tương tự rằng chúng ta có thể nhận được giá trị của phần tử đúng nhất trong EDIT: giải pháp của tôi sai, dường như nó không có bất kỳ giải phápO(1)o(n)

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.