Độ phức tạp của toán tử * in * trong Python


88

Độ phức tạp của intoán tử trong Python là gì? Nó có phải là theta (n) không?

Có giống như sau không?

def find(L, x):
   for e in L:
       if e == x:
           return True
   return False

L là một danh sách.


3
Nó phụ thuộc vào loại vùng chứa, vì sử dụng nó với từ điển hoặc tập hợp sẽ nhanh hơn nhiều so với với một mảng.
Greg Hewgill

1
@BasicWolf Tôi đã sử dụng L, vì vậy nó là danh sách
Sajad Rastegar

5
@Rastegar Lkhông ngụ ý một danh sách. seqlà lựa chọn phổ biến nhất mà người ta muốn ám chỉ một danh sách. Llà một tên biến khủng khiếp. Những chữ cái đơn là xấu, và viết hoa ngụ ý đó là một đẳng cấp. Ngay cả khi nó là một cái gì đó cụ thể, Python là động, vì vậy hãy nói rõ nó trong trường hợp như thế này.
Gareth Latty 14/12/12

1
Lnghĩa là listgì? Libtelepathy.so của tôi có lẽ đã lỗi thời.
Zaur Nasibov 14/12/12

1
@GarethLatty Sử dụng lst cũng là một tên tốt để xác định mộtlist
r0ei

Câu trả lời:


145

Sự phức tạp của inphụ thuộc hoàn toàn vào những gì Llà. e in Lsẽ trở thành L.__contains__(e).

Xem tài liệu về độ phức tạp thời gian này để biết độ phức tạp của một số kiểu cài sẵn.

Đây là bản tóm tắt cho in:

  • danh sách - Trung bình: O (n)
  • set / dict - Trung bình: O (1), Kém nhất: O (n)

Trường hợp xấu nhất O (n) đối với tập hợp và tập hợp là rất hiếm gặp, nhưng nó có thể xảy ra nếu __hash__được thực hiện kém. Điều này chỉ xảy ra nếu mọi thứ trong tập hợp của bạn có cùng giá trị băm.


1
Có ai tình cờ biết được sự phức tạp của toán tử "in" cho một OrderDict không?
Josh Sherick

1
Sau một số thử nghiệm, tôi có thể xác nhận rằng độ phức tạp của OrderedDict trong Python 2.7 dường như là O (1) trong trường hợp trung bình.
Josh Sherick

@Josh Sherick, bạn không cần phải cung cấp các bài kiểm tra, tất cả những gì bạn cần là các nguồn OrderedDictvà như bạn có thể tìm hiểu: OrderedDictđược kế thừa từ đó dict, vì vậy hầu hết các hoạt động (tất nhiên, có ngoại lệ) đều có cùng độ phức tạp .
maxkoryukov

Độ phức tạp thời gian của toán tử "in" là O (n) đối với tuple?
Geek được kế thừa vào

1
@whitehat tuyến tính.
juanpa.arrivillaga

13

Nó phụ thuộc hoàn toàn vào loại vật chứa. Các vùng chứa băm ( dict, set) sử dụng hàm băm và về cơ bản là O (1). Các chuỗi điển hình ( list, tuple) được thực hiện như bạn đoán và là O (n). Cây sẽ là trung bình O (log n). Và như thế. Mỗi loại này sẽ có một __contains__phương pháp thích hợp với đặc điểm big-O của nó.


của giá trị là bao gồm chi phí tạo băm.
Woot4Moo 14/12/12

Các loại dữ liệu băm bao gồm dictset(cũng như các loại dữ liệu tiềm năng khác)
Dave

2
@ Woot4Moo: Khi bạn đang nói về độ phức tạp tiệm cận, điều đó không liên quan. Chi phí tạo hàm băm là không đổi. Khi bạn đang xử lý các giá trị nhỏ của N, việc lập hồ sơ trở nên quan trọng, bởi vì, giả sử, 100 >> 2N cho N. Nhưng đó là một vấn đề riêng biệt với những gì OP đã hỏi về; đối với N khổng lồ, 100 << 2N, đó là những gì phức tạp về.
abarnert 14/12/12

@abarnert, nó thực sự khá phù hợp, vì bạn không tùy tiện chọn cấu trúc dữ liệu. Bạn phải xem xét việc sử dụng và các cách phổ biến nhất mà cấu trúc sẽ được sử dụng, vì vậy, điều quan trọng là phải xem xét lượng thời gian cho một hàm băm, đặc biệt là trong một trường hợp mà phải tính toán mỗi lần lặp lại chương trình.
Woot4Moo 14/12/12

@ Woot4Moo: Nếu ai đó đang hỏi về độ phức tạp tiệm cận, hoặc (a) họ mong đợi giải quyết một N lớn, hoặc (b) họ là một tên ngốc. Tôi giả định OP là trường hợp (a), nhưng theo cách nào đó, hệ số hằng số không liên quan đến câu trả lời.
abarnert 14/12/12

-1

Nó phụ thuộc vào vùng chứa bạn đang thử nghiệm. Đó thường là những gì bạn mong đợi - tuyến tính đối với các cấu trúc dữ liệu có thứ tự, không đổi đối với không có thứ tự. Tất nhiên, có cả hai loại (có thứ tự hoặc không có thứ tự) có thể được hỗ trợ bởi một số biến thể của cây.


@ZoranPavlovic A in Bkiểm tra xem Acó ở trong không B.
Marcin

1
Tôi chắc chắn mong đợi thời gian logarit trong một cấu trúc có thứ tự.
DedObed

@dedObed Tại sao bạn lại mong đợi điều đó? Bạn có mong đợi python đã biết liệu dữ liệu của bạn có được sắp xếp hay không?
Marcin

Bởi vì nếu có một thùng chứa được thiết kế để đặt hàng, thì lý do rõ ràng là cho phép tra cứu lôgarit. Nhưng tôi đoán đó chỉ là vấn đề đặt tên, tôi sẽ sử dụng "tuyến tính" nơi bạn đã viết "theo thứ tự" và tất cả sẽ ổn. (Trong đầu tôi - tiếng Anh như ngôn ngữ thứ hai ở đây.)
đăng
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.