O (log * N) là gì?


80

O (log * N) là gì và nó khác O (log N) như thế nào?


Câu hỏi tương tự: stackoverflow.com/questions/2307283/…O(log* N) Rất tiếc, không có câu trả lời .
BalusC

1
Câu hỏi này là về dấu * sau log hay về ký hiệu O () nói chung?
Bart van Heukelom

1
Nó nằm trong một số cấu trúc dữ liệu nâng cao, mặc dù tôi đã nghỉ học quá lâu để nhớ nó đến từ đâu!
Larry

1
Tôi đoán là không quá nâng cao, chỉ cần nhớ - Giới hạn dưới ban đầu của Union Find with path nén được đặt ở O (n log * n) cho đến khi nó được hạ xuống O (A n), trong đó A là hàm Ackermann nghịch đảo ..
Larry

1
Heh. Trong thực tế, tôi nghĩ rằng tôi sẽ hài lòng với ước tính O (n) cho điều đó. :-)
RBarryYoung

Câu trả lời:


84

O( log* N )là " logarit lặp lại ":

Trong khoa học máy tính, logarit lặp lại của n, được viết là log * n (thường được đọc là "log sao"), là số lần hàm logarit phải được áp dụng lặp đi lặp lại trước khi kết quả nhỏ hơn hoặc bằng 1.


9
Đó là điều thực sự thú vị mà tôi chưa từng nghe nói đến. Q + A +1 mỗi cái. Tôi đoán O (log * N) là dành cho tất cả các mục đích và mục đích O (1). Mát mẻ.
Greg

1
@greg, không có log (n) có nghĩa là khi số lượng phần tử tăng lên thì thời gian càng chậm. ví dụ. 10x như nhiều yếu tố duy nhất làm cho các chức năng chụp 2x càng lâu
Martin Beckett

2
Tôi nghĩ lần đầu tiên tôi bắt gặp nó trong phân tích của thuật toán Union-Find, khi nó O( N log* N )trước khi nó được cải tiến thành O( A N ), trong đó A là hàm Ackermann nghịch đảo. Tôi vẫn không hiểu bằng chứng thứ hai, nhưng O( N log* N )thuật toán tương đối tốt.
Larry

13
@Martin, nhưng đây là log * (n) tăng chậm một cách điên cuồng, chẳng hạn như log * (2 ^ 65536 -1) = 5. Bạn cũng có thể gọi đó là hằng số.
Greg

4
Xin lỗi đã không đánh giá cao sự khác biệt của log-star, cảm ơn - học được điều gì đó mới!
Martin Beckett

25

Các log* Nbit là một thuật toán lặp mà phát triển rất chậm, chậm hơn nhiều so với chỉ log N. Về cơ bản, bạn chỉ cần lặp đi lặp lại 'ghi nhật ký' câu trả lời cho đến khi nó thấp hơn một (Ví dụ log(log(log(...log(N))):), và số lần bạn phải log()là câu trả lời.

Dù sao, đây là một câu hỏi đã 5 năm tuổi trên Stackoverflow, nhưng không có mã nào? (!) Hãy khắc phục điều đó - đây là cách triển khai cho cả hàm đệ quy và lặp (cả hai đều cho cùng một kết quả):

public double iteratedLogRecursive(double n, double b)
{
    if (n > 1.0) {
        return 1.0 + iteratedLogRecursive( Math.Log(n, b),b );
    }
    else return 0;
}

public int iteratedLogIterative(double n, double b)
{
    int count=0;
    while (n >= 1) {
        n = Math.Log(n,b);
        count++;
    }
    return count;
}

2
Làm thế nào để trả lời câu hỏi này?
Maroun

3
@MarounMaroun: Tôi đã chỉnh sửa phần đầu của câu trả lời để cung cấp thêm ngữ cảnh. Mã là mô tả / định nghĩa mà anh ta yêu cầu.
Dan W

9

log * (n) - "log Star n" còn được gọi là "logarit lặp lại"

Nói một cách dễ hiểu, bạn có thể giả sử log * (n) = log (log (log (..... (log * (n))))

log * (n) rất mạnh mẽ.

Thí dụ:

1) Nhật ký * (n) = 5 trong đó n = Số nguyên tử trong vũ trụ

2) Tô màu cây bằng cách sử dụng 3 màu có thể được thực hiện trong log * (n) trong khi tô màu Cây 2 màu là đủ nhưng độ phức tạp sẽ là O (n) sau đó.

3) Tìm tam giác Delaunay của một tập hợp các điểm biết cây khung cực tiểu Euclide: thời gian O (n log * n) ngẫu nhiê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.