Độ sâu của đệ quy là gì nếu chúng ta chia một mảng thành


7

Chúng ta có một hàm lấy một mảng làm đầu vào. Nó chia một mảng thành các phần với kích thước bằng nhau trong đó là kích thước của phân đoạn. Nó tiếp tục phá vỡ từng phân đoạn cho đến khi chỉ còn hai yếu tố trong đó. Độ sâu của đệ quy này là gì?log2(n)n

Ví dụ về quy trình:

Đầu tiên chúng ta có phần tử và chia chúng thành các phần với kích thước bằng nhau. Mỗi phần này có các phần tử trong đó. Trong cấp độ đệ quy tiếp theo, chúng tôi sẽ chia từng phần con thành các phần với kích thước bằng nhau. Bây giờ chúng sẽ có các phần tử trong mỗi một trong số chúng. Và chúng tôi tiếp tục phá vỡ mảng theo cách này cho đến khi chúng tôi đạt được một phân đoạn chỉ có hai yếu tố trong đó.nlog2(n)nlog2(n)log2(nlog2(n))nlog2(n)log2(nlog2(n))


Nó dễ dàng tính toán, phải không? Hãy thử n = 1.000.000 chẳng hạn. Làm điều đó bằng tay thì nó sẽ rõ ràng.
gnasher729

1
@ gnasher729 tôi vẫn chưa rõ ...
Hinko Pih Pih

Log_2 (1.000.000) là gì? Sau đó, nếu bạn chia 1.000.000 mục thành nhiều phân đoạn có kích thước bằng nhau, mỗi mục có kích thước bao nhiêu? Nếu bạn làm lại thì sao?
gnasher729

Tôi sẽ không chia mảng thành log2(1,000,000)bộ phận mỗi lần. Ở bước đầu tiên có, nhưng sau đó tôi sẽ chia nó thànhlog2(1,000,000log2(1,000,000))và như thế.
Hinko Pih Pih

Bạn đã nói "trong đó n là kích thước của mảng", chứ không phải "trong đó n là kích thước của phân đoạn". Nó làm cho sự khác biệt nhỏ trong thực tế.
gnasher729

Câu trả lời:


5

Để cho f(n)=n/lognvà biểu thị bằng g(n) số lượng ứng dụng của f nó cần để có được ndưới một số hằng số tùy ý. Một mặt,f(t)(n)n/logtn, và vì thế

g(n)loglognn=lognloglogn.
Để có được giới hạn trên, hãy lưu ý rằng miễn là f(t)(n)n, chúng ta có logf(t)(n)(logn)/2và vì vậy nó mất nhiều nhất log(logn)/2n=O(logn/loglogn) lặp đi lặp lại để giảm n đến n. Lập luận tương tự áp dụng cho việc giảmn đến n4 và như vậy, và do đó
g(n)lognloglogn+lognloglogn+logn4loglogn4+.
(Đây giống như =O().) Thông báo rằng logn=12logn. Cho lớnn, chúng ta sẽ có loglogn23loglogn (nói), và như vậy
lognloglogn23lognloglogn.
Do đó, tổng được chia thành một chuỗi hình học hội tụ và chúng tôi kết luận rằng
g(n)=O(lognloglogn).
Tổng cộng, chúng tôi nhận được rằng
g(n)=Θ(lognloglogn).
Với nhiều công việc hơn, chúng ta có thể chứng minh một ước tính tinh tế hơn như
g(n)lognloglogn.


Làm gì tđại diện?
Hinko Pih Pih

Đó là số lần bạn áp dụng f.
Yuval Filmus

Tôi không thể hiểu làm thế nào bạn có g(n)loglognntừ bất đẳng thức đầu tiên.
Hinko Pih Pih

Bằng cách giải phương trình n/logtn=1. Đây1là liên tục tùy ý của tôi.
Yuval Filmus

Bây giờ tôi không hiểu làm thế nào bạn có log(logn)/2n lặp đi lặp lại từ logf(t)(n)(logn)/2. Bạn có thể vui lòng giải thích cho tôi?
Hinko Pih Pih

2

Có vẻ như bạn đang đề cập đến logarit lặp, còn được gọi là logchức năng. Đây là một hàm biểu thị số lần bạn có thể lấy logarit của một số cho đến khi nó tạo ra một số nhỏ hơn hoặc bằng 1.

Các logchức năng phát triển rất chậm. Nó là nghịch đảo của tetration.

Xem thêm về điều đó ở đây .


2
Nó không phải là logarit lặp. Ví dụ: ở bước đầu tiên tôi sẽ cón các yếu tố và tách nó thành log2(n)các bộ phận. Trong mỗi phần tôi sẽ cónlog2(n). Điều đó có nghĩa là ở cấp độ tiếp theo tôi sẽ không lấy logarit của logarit. Tôi sẽ tách subarray thànhlog2(nlog2(n)) những phần chắc chắn là nhiều hơn log2(log2(n)). Và mô hình này tiếp tục. Tôi đã thực sự viết chương trình và độ sâu của đệ quy luôn lớn hơnlog2(log2(n)) và luôn nhỏ hơn log2(n).
Hinko Pih Pih

2

Gọi n là kích thước của mảng. Đặt k = log2 (n). Ở bước đầu tiên, bạn chia cho k. Miễn là kích thước mảng nhiều hơnn1/2, bạn chia cho nhiều hơn k / 2. Tôi muốn nói đây là O (log n / log log n).

(Luôn tách thành k phần sẽ tách log n / log k. Bạn đã hỏi trường hợp đặc biệt k = log n, do đó log n / log log n. Sau đó, bạn cần quyết định xem thu nhỏ k có tạo ra sự khác biệt hay không.)


Nhưng kích thước subarray sẽ nhỏ hơn n12tại một số điểm. Và ngay cả khi điều đó không đúng, tôi không hiểu làm thế nào bạn có đượcO(log2(n)log2(log2(n))).
Hinko Pih Pih

Câu trả lời được chỉnh sửa của bạn cung cấp một lời giải thích tốt cho một hằng số k nhưng ở đây kkhông phải là hằng số vì vậy nó vẫn không hữu ích.
Hinko Pih Pih

1

Tất cả logarit dưới đây có nghĩa là logarit với cơ sở 2, log2().


Hãy để chúng tôi đặt tên cho chức năng được đưa ra trong câu hỏi slog. ("slog" comes from splitting with log. It can also imply "smaller than log".) In precise terms, slog on N is defined by the following conditions.

  • base case, slog(1)=0 and slog(2)=1.
  • the recurrence relation, slog(n)=1+slog(nlogn) for n>2.

We can prove the following proposition on the asymptotic behavior of slog(n).

limn slog(n)lognloglogn=1.

Here is the basic idea of the proof.

limnlognloglognlognlognloglognlogn=limmmlogmmlogmlog(mlogm)=limmmlogmmlogmlogm+log(1logmm)=limm(logm)2+mlog(1logmm)(logm)(logm+log(1logmm))=limm(logm)2+m(logmm)(logm)(logm)=1

Corollary. slog(n)=Θ(lognloglogn).


The same conclusion holds if we define slog(x) for x>1 with slog(x)=1 for 1<x2 and slog(n)=1+slog(nlogn).


Exercise. Write the full proof of slog(n)lognloglogn.


The asymptotic result here should be folklore or known. However, I have not found any reference yet.
John L.
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.