Cách tiếp cận thử thách Gậy dọc


23

Vấn đề này được lấy từ phỏng vấn.com

Chúng tôi được cung cấp một mảng các số nguyên Y={y1,...,yn} đại diện cho phân đoạn dòng sao cho điểm cuối của phân khúc là và . Hãy tưởng tượng rằng từ đỉnh của mỗi phân đoạn, một tia ngang được bắn sang trái và tia này dừng lại khi chạm vào một phân đoạn khác hoặc nó chạm vào trục y. Chúng tôi xây dựng một mảng gồm n số nguyên, , trong đó bằng với độ dài tia bắn từ đỉnh của phân đoạn . Chúng tôi xác định .ni(i,0)(i,yi)v1,...,vnviiV(y1,...,yn)=v1+...+vn

Ví dụ: nếu chúng ta có , thì , như trong hình dưới đây:Y=[3,2,5,3,3,4,1,2][v1,...,v8]=[1,1,3,1,1,3,1,2]

nhập mô tả hình ảnh ở đây

Với mỗi hoán vị của , chúng ta có thể tính . Nếu chúng ta chọn một hoán vị ngẫu nhiên thống nhất là , giá trị mong đợi của gì?[ 1p[1,...,n]V(yp1,...,ypn)p[1,...,n]V(yp1,...,ypn)

Nếu chúng ta giải quyết vấn đề này bằng cách sử dụng phương pháp ngây thơ, nó sẽ không hiệu quả và chạy thực tế mãi mãi với . Tôi tin rằng chúng ta có thể tiếp cận vấn đề này bằng cách tính toán một cách độc lập giá trị dự kiến ​​của cho mỗi thanh nhưng tôi vẫn cần biết rằng có một cách tiếp cận hiệu quả khác cho vấn đề này. Trên cơ sở nào chúng ta có thể tính toán giá trị kỳ vọng cho mỗi thanh một cách độc lập?v tôin=50vi


Bạn có thể sử dụng tuyến tính của kỳ vọng. Câu hỏi này có lẽ phù hợp hơn ở môn toán.SE

Câu trả lời:


23

Hãy tưởng tượng một vấn đề khác: nếu bạn phải đặt gậy có chiều cao bằng nhau trong n khe thì khoảng cách dự kiến ​​giữa các gậy (và khoảng cách dự kiến ​​giữa gậy đầu tiên và khe ghi chú 0 và khoảng cách dự kiến ​​giữa gậy cuối cùng và một ghi chú khe n + 1 ) là n + 1kn0n+1 vì cókhoảng trốngk+1để vừa với chiều dàin+1.n+1k+1k+1n+1

Quay trở lại vấn đề này, một cây gậy đặc biệt quan tâm đến việc có bao nhiêu cây gậy (bao gồm cả chính nó) cao hay cao hơn. Nếu số này là , thì khoảng cách dự kiến ​​ở bên trái của nó cũng là n + 1k .n+1k+1

Vì vậy, thuật toán chỉ đơn giản là tìm giá trị này cho mỗi thanh và cộng thêm kỳ vọng. Ví dụ: bắt đầu với độ cao của , số gậy có chiều cao lớn hơn hoặc bằng là [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] vì vậy kỳ vọng là 9[3,2,5,3,3,4,1,2][5,7,1,5,5,2,8,7].96+98+92+96+96+93+99+98=15,25

Điều này rất dễ lập trình: ví dụ một dòng đơn trong R

V <- function(Y){ (length(Y) + 1) * sum( 1 / (rowSums(outer(Y, Y, "<=")) + 1) ) }

đưa ra các giá trị trong đầu ra mẫu trong bài toán ban đầu

> V(c(1,2,3))
[1] 4.333333
> V(c(3,3,3))
[1] 3
> V(c(2,2,3))
[1] 4
> V(c(10,2,4,4))
[1] 6
> V(c(10,10,10,5,10))
[1] 5.8
> V(c(1,2,3,4,5,6))
[1] 11.15

1
Rất thú vị. Bạn có thể vui lòng giải thích một chút về lý do tại sao khoảng cách dự kiến ​​giữa các gậy là ; vì nó không rõ ràng (ít nhất là với tôi) nó đã được tính toán như thế nào. Cảm ơn bạn. (n+1)/(k+1)
M. Alaggan

Trong trường hợp đầu tiên của tôi là gậy có chiều cao bằng nhau, có một chiều dài n + 1 được lấp đầy với các khoảng trống k + 1 để khoảng cách trung bình đến từ việc chia cho nhau. Đây là khoảng cách dự kiến ​​(hoặc tia ngang) trước bất kỳ thanh cụ thể nào (và từ thanh cuối cùng đến n + 1 ). Nó chuyển đến câu hỏi ban đầu, có tính đến các thanh tài khoản cao hoặc cao hơn bất kỳ thanh cụ thể nào. kn+1k+1n+1
Henry

Rất đẹp. Điều này hoàn toàn bao gồm giải pháp của tôi; nếu tất cả đỉnh cao là rõ rệt, sau đó . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
JeffE

2
@Henry: Đối với k gậy có chiều cao bằng nhau, n vấn đề, lý do của bạn về chiều dài trung bình = (n + 1) / (k + 1) là gì? Nếu tôi có k gậy và tôi muốn biết độ dài tia trung bình của một trong những gậy đó trong mỗi lần hoán vị của các que k đó trong n khe, thì thực tế nó không bằng kết quả của bạn, nhưng tôi không hiểu tại sao. Có logic hay bạn đã suy luận về mặt toán học từ việc thực hiện những gì tôi mô tả cho 1 thanh và n vị trí, sau đó là 2 thanh và n, vị trí, ... k gậy, n vị trí và nhận thấy rằng nó bằng (n + 1) / ( k + 1)? Bạn đề cập đến việc thêm một khe n + 1. Điều đó có vẻ rất phản trực giác.
Alexandre

3
Đó là một câu hỏi tôi đã giải quyết trước đây. Bắt đầu với một bàn tròn với chỗ ngồi và k + 1 người và ngồi chúng ngẫu nhiên. Khoảng cách giữa các cá nhân rõ ràng là iid với trung bình ( n + 1 ) / ( k + 1 ) . Bây giờ phá vỡ bảng ở n + 1 thứ người, loại bỏ người đó và ghế của họ, và duỗi thẳng bàn. Bây giờ bạn có câu hỏi ở đây với n chỗ ngồi và k người nhưng cùng một tài sản iid và cùng một nghĩa. (Phát hiện những vần điệu hiếm trong tháng )n+1k+1(n+1)/(k+1)n+1thnk
Henry

11

Giải pháp của Henry vừa đơn giản vừa tổng quát hơn giải pháp này!


gần bằng một nửa số so sánh dự kiến ​​được thực hiện bởi quicksort ngẫu nhiên.E[V]

Giả sử các que có chiều cao khác biệt , chúng ta có thể rút ra một giải pháp dạng đóng cho như sau.E[Y]

Đối với mọi chỉ số , hãy để X i j = 1 nếu Y j = max { Y i , . . . , Y j }X i j = 0 nếu không. (Nếu các yếu tố của Ykhông rõ rệt, sau đó X i j = 1 phương tiện mà Y jđúng lớn hơn mọi phần tử của { Y iijXij=1Yj=max{Yi,...,Yj}Xij=0YXij=1Yj).{Yi,,Yj1}

Sau đó, đối với bất kỳ chỉ số , chúng tôi có v j = Σ j i = 1 X i j (Bạn có thấy tại sao?) Và do đó V = n Σ j = 1 v j = n Σ j = 1 j Σ i = 1 Xjvj=i=1jXij

V=j=1nvj=j=1ni=1jXij.

Độ tuyến tính của kỳ vọng ngay lập tức ngụ ý rằng

E[V]=E[1ijnXij]=1ijnE[Xij].

0 hoặc 1 , nên ta có E [ X i j ] = Pr [ X iXij01.E[Xij]=Pr[Xij=1]

Cuối cùng, và đây là bit quan trọng bởi vì các giá trị trong khác biệt và được hoán vị đồng nhất, mỗi phần tử của tập hợp con { Y i , . . . , Y j } có khả năng là phần tử lớn nhất trong tập hợp con đó. Do đó, Pr [ X i j = 1Y{Yi,...,Yj} . (Nếu các phần tử củaYkhông khác biệt, chúng ta vẫn cóPr[Xij=1Pr[Xij=1]=1ji+1Y )Pr[Xij=1]1ji+1

Và bây giờ chúng ta chỉ có một số toán học. trong đóHn

E[V]=j=1ni=1jE[Xij][linearity]=j=1ni=1j1ji+1[uniformity]=j=1nh=1j1h[h=ji+1]=h=1nj=hn1h[1hjn]=h=1nnh+1h=((n+1)h=1n1h)(h=1n1)=(n+1)Hnn
Hn biểu thị số hài thứ .n

Bây giờ sẽ là tầm thường khi tính (chính xác đến điểm nổi) trong O ( n )E[V]O(n) thời gian .


Điều này có cho rằng gậy có chiều cao khác biệt?
Aryabhata

Vâng, nó không giả định chiều cao khác biệt. (Rõ ràng, tôi đã đọc sai câu hỏi.) Sự tương đương với quicksort ngẫu nhiên vẫn đứng khi có các mối quan hệ, nhưng không phải là giải pháp dạng đóng.
JeffE

4

Như đã đề cập trong các ý kiến, bạn có thể sử dụng Tuyến tính mong đợi.

Sắp xếp các : y 1y 2y n .yy1y2yn

Với mỗi xem xét giá trị mong đợi của v i = E [ v i ]yivi=E[vi] .

E[i=1nvi]=i=1nE[vi]

E[vi]yij

j1yi .

j1<yij2ytôi

và như vậy sẽ cho phép bạn tính toán E[vtôi].

Bạn có thể có thể làm cho nó nhanh hơn bằng cách thực sự làm toán và nhận một công thức (mặc dù tôi đã không tự mình thử nó).

Mong rằng sẽ giúp.


3

Mở rộng câu trả lời của @Aryabhata:

Sửa một tôivà giả sử mục này ytôi đang ở vị trí j. Giá trị chính xác của chiều cao là không quan trọng, điều quan trọng là liệu các mặt hàng có lớn hơn hoặc bằngytôihay không. Vì vậy, hãy xem xét các bộ các mặt hàngZ(tôi), Ở đâu zk(tôi) là 1 nếu ykytôizk(tôi) bằng 0 nếu không.

Một hoán vị trên tập hợp Z(tôi) gây ra một hoán vị tương ứng trên tập hợp Y. Ví dụ, hãy xem xét hoán vị sau của tập hợpZ(tôi): "01000 (1)Giáo dục". Mục này ztôi(tôi) là một trong những dấu ngoặc, ở vị trí jvà các mục được biểu thị bằng "Giáo dục"Không quan trọng.

Giá trị của vtôi sau đó là 1 cộng với chiều dài của các số 0 liên kết ở bên trái của ztôi(tôi). Nó theo đóE(vtôi) is actually 1 plus the expected length of consecutive zeors, until the first "1" is met, if we pick at most j1 bits from the set Z(i)zi(i)(without replacement). This is reminiscent of the geometric distribution, except that it would be without replacement (and bounded number of draws). The expectation is to be taken on j as well, as a uniform choice on the set of positions {1,,n}.

Once this is computed (along these lines), we can follow the lines of @Aryabhata's answer.


-2

Tôi không thực sự hiểu bạn làm gì, từ các thẻ có vẻ như bạn đang tìm kiếm một thuật toán.

Nếu vậy, độ phức tạp thời gian dự kiến ​​là gì? bằng cách nói: "Nếu chúng ta giải quyết vấn đề này bằng cách sử dụng phương pháp ngây thơ, nó sẽ không hiệu quả và chạy thực tế mãi mãi với n = 50." Dường như với tôi rằng cách tiếp cận ngây thơ của bạn giải quyết nó theo thời gian.

tôi có một thuật toán O (n ^ 2) trong tâm trí tho.

assume int y[n], v[n] where v[i] initialized with 1; as described in the question
for (i=1;i<n;i++) 
   for ( j=i-1 ; j>=0 && y[j]<y[i] ; j--) v[i]++;
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.