Hướng dẫn what is the time complexity of string concatenation python? - độ phức tạp về thời gian của python nối chuỗi là bao nhiêu?

Có, trong trường hợp của bạn*1 Concatenation chuỗi yêu cầu tất cả các ký tự được sao chép, đây là thao tác O (N+M) (trong đó N và M là kích thước của các chuỗi đầu vào). M cộng sự của cùng một từ sẽ có xu hướng theo thời gian o (m^2).

Bạn có thể tránh hành vi bậc hai này bằng cách sử dụng str.join():

word = ''.join(list_of_words)

chỉ mất o (n) (trong đó n là tổng chiều dài của đầu ra). Hoặc, nếu bạn đang lặp lại một ký tự duy nhất, bạn có thể sử dụng:

word = m * char

Bạn đang chuẩn bị các ký tự, nhưng trước tiên xây dựng danh sách, sau đó đảo ngược nó (hoặc sử dụng đối tượng collections.deque() để có được hành vi O (1)) sẽ vẫn là sự phức tạp của O (n), dễ dàng đánh bại lựa chọn O (n^2) của bạn ở đây.


*1 Khi Python 2.4, việc triển khai CPython tránh tạo một đối tượng chuỗi mới khi sử dụng strA += strB hoặc

word = m * char
0, nhưng tối ưu hóa này vừa mỏng manh vừa không di động. Vì bạn sử dụng
word = m * char
1 (dự bị), việc tối ưu hóa không được áp dụng.

Tôi luôn luôn kết hợp các chuỗi bằng cách sử dụng nhà điều hành++không phân biệt ngôn ngữ mà tôi mã chỉ để nhận ra sau đó rằng tôi đã làm sai chúng. Để chính xác, không hiệu quả.

Hôm nay, chúng ta sẽ thảo luận về sự kết hợp chuỗi trong Python và cách thực hiện nó một cách hiệu quả.

Một sự kết hợp đơn giản:

x =  "hello"
y =  "world"
print(x + y)

Output:
helloworld

Như chúng ta nhận thức được thực tế rằng các đối tượng chuỗi là bất biến trong Python, bất kỳ hoạt động nối nào sử dụng toán tử+++có thể chứng minh là tốn kém.

Tại sao nó như vậy?

Các đối tượng chuỗi là bất biến trong Python và bất kỳ thao tác nối nào cũng tạo ra một chuỗi mới, sao chép ký tự chuỗi cũ theo ký tự và sau đó nối dây chuỗi mới được nối.

Để rõ ràng, hãy để tôi giải thích với một ví dụ:

def concat_strings():
    """
    This is a program to remove spaces in a string
    :return:
    """

    input_string = "Th is is an ex am pl ew it hs pa ce"

    output_string = ""

    for i in input_string:
        if i == " ":
            pass
        else:
            output_string += i

    print(output_string)


concat_strings()

Output:
Thisisanexamplewithspace

Chương trình này loại bỏ các không gian trắng trong một chuỗi và in chuỗi mới mà không có khoảng trắng. Điều này lặp lại thông qua & nbsp; ________ 12character theo ký tự và nối với một chuỗi mới có tên & nbsp; ________ 13 & nbsp; trong khi bỏ qua các không gian trắng.

Mặc dù điều này & nbsp; get & nbsp; công việc thực hiện điều này không hiệu quả lắm, phải không?

Lý do cho điều này là, trên mỗi hoạt động của++, một chuỗi mới được tạo ra (hãy nhớ các chuỗi là bất biến?) Mỗi ​​lần và các giá trị hiện có phải được sao chép ký tự theo ký tự.

Độ phức tạp của thời gian của hoạt động này là & nbsp; ________ 14. Chờ đợi… làm thế nào?

Hướng dẫn what is the time complexity of string concatenation python? - độ phức tạp về thời gian của python nối chuỗi là bao nhiêu?

Kết nối bằng cách sử dụng toán tử + dưới mui xe:

Để có được một ý tưởng cơ bản về sự phức tạp về thời gian và sự phức tạp không gian, vui lòng tham khảo & nbsp; bài viết này & nbsp;

Hãy để Lừa hướng dẫn chương trình Lặp lại chương trình bằng cách lặp.

Trong Lặp lại 1, một đối tượng mới & nbsp; Vì vậy, chuỗi mới của chúng tôi hiện có 1 ký tự.

Trong Lặp lại 2, một lần nữa, một & nbsp mới được tạo ra và lần này, Tiên được sao chép. Thêm vào đó, thì H Hv còn được thêm vào. Điều này tiếp tục cho mỗi lần lặp. (Tôi đã bỏ qua việc lặp lại cho không gian để đơn giản).

Vì vậy, những gì chúng ta quan sát ở đây?

Đối với mỗi lần ghép, số lượng ký tự được sao chép tăng bậc hai.

Iteration 1:
1 character (“T”) = 1

Iteration 2:
2 characters(“T”, “h”) = 1+1

Iteration 3:
3 characters(“T”, “h”, “i”) = 1+1+1

Iteration 4:
4 characters(“T”, “h”, “i”, ”s”) = 1+1+1+1

và như vậy cho đến khi chiều dài của chuỗi.

Nếu chúng ta quan sát mẫu, số lượng bản sao trong quá trình ghép là 1 (không có ký tự) + 2 (số lượng ký tự) + 3 (số lượng ký tự) +, .. + (n).

Điều này đưa chúng ta đến tổng số n số tự nhiên là & nbsp; ________ 18 & nbsp; sẽ cung cấp cho chúng tôi & nbsp; Vì số lượng ký tự cho mỗi lần ghép luôn không đổi ở đây (1 trong trường hợp này), chúng tôi có thể bỏ hệ số không đổi mang lại cho chúng tôi & nbsp; ____ 14.

Điều tương tự cũng áp dụng cho sự kết hợp của các chuỗi có chiều dài khác nhau là tốt. Đối với sự kết hợp của các chuỗi có độ dài khác nhau, nó phải là & nbsp; ____ ____ 21 & nbsp; trong đó n và m là độ dài của hai chuỗi được nối. Tuy nhiên, hành vi vẫn sẽ là bậc hai dựa trên độ dài của các chuỗi do sự kết hợp lặp đi lặp lại.

Vì vậy, để tóm tắt, các chuỗi nối với + là một hoạt động tốn kém, đặc biệt là nếu chuỗi được nối là dài.

Từ các tài liệu Python:

Các chuỗi bất biến luôn luôn dẫn đến một đối tượng mới. Điều này có nghĩa là việc xây dựng một chuỗi bằng cách kết hợp lặp đi lặp lại sẽ có chi phí thời gian chạy bậc hai trong tổng chiều dài trình tự.

Làm thế nào để chúng ta vượt qua điều này?

Chà, tốt hơn hết là sử dụng A & NBSP; ________ 22 & nbsp; để lưu trữ tất cả các chuỗi được nối và tham gia chúng bằng phương thức & nbsp; ____ 7 & nbsp;

________ 7 & nbsp; lấy một & nbsp; ________ 25as một đối số và trả về một chuỗi là sự kết hợp của tất cả các đối tượng chuỗi trong & nbsp; ____ ____ 26.

def concat_strings():
    """
    This is a program to remove spaces in a string
    :return:
    """

    </em>input_string = "Th is is an ex am pl ew it hs pa ce"

    output_lst = list()

    for i in input_string:
        if i == " ":
            pass
        else:
            output_lst.append(i)

    print("".join(output_lst))


Output:

Thisisanexamplewithspace

Ở đây, chúng tôi đã sửa đổi ví dụ trước đây của chúng tôi để lưu trữ mỗi chuỗi thành A & nbsp; ________ 22 & nbsp; và cuối cùng & nbsp; ________ 28 & nbsp; Xin lưu ý rằng việc thêm vào danh sách luôn luôn là & nbsp; ________ 29. Vì vậy, điều đó không nên tác động đến thời gian chạy của chương trình.

Đây là một cách hiệu quả hơn để kết hợp các chuỗi thay vì sử dụng một loại++. Độ phức tạp về thời gian của việc sử dụng & nbsp; ________ 30 & nbsp; cho các chuỗi là & nbsp; ________ 31 & nbsp; trong đó n là độ dài của chuỗi được nối.

Phải nói rằng, sự khác biệt trong thời gian thực hiện sẽ chỉ có ý nghĩa nếu các chuỗi được nối là dài. Đối với các chuỗi nhỏ hơn, chúng ta có thể không thấy một sự khác biệt lớn.

  • https://docs.python.org/3/library/stdtypes.html#str.join
  • https://docs.python.org/3/library/stdtypes.html

Lưu ý: Ví dụ thứ hai cũng có thể được viết dưới dạng một lớp lót như được chỉ ra trong các bình luận. Điều này có thể làm giảm thêm số lượng dòng mã. Tuy nhiên, thời gian chạy vẫn sẽ vẫn giống như độ phức tạp thời gian của & nbsp; ________ 32 & nbsp; is & nbsp; ________ 31.

def concat_strings():
    """
    This is a program to remove spaces in a string
    :return:
    """

    input_string = "Th is is an ex am pl ew it hs pa ce"

    print("".join(input_string.split()))


Output:

Thisisanexamplewithspace

Summary:

  • Các chuỗi nối bằng cách sử dụng + không hiệu quả.
  • Độ phức tạp của thời gian của sự kết hợp chuỗi bằng cách sử dụng + is & nbsp; ________ 14
  • Nó luôn luôn tốt hơn để tận dụng & nbsp; ____ ____ 7 & nbsp; để nối dây
  • ________ 7 & nbsp; thực thi trong & nbsp; ________ 31 & nbsp; thời gian.

bài chuyển hướng

Concatenation chuỗi có chậm không?

Mỗi lần gọi Strcat, vòng lặp sẽ chạy từ đầu đến cuối;Chuỗi càng dài, vòng lặp càng dài.Cho đến khi chuỗi rộng, việc bổ sung chuỗi diễn ra rất nặng và chậm.Until the string is extensive, the string addition takes place very heavy and slow.

Cách hiệu quả nhất để kết hợp các chuỗi trong Python là gì?

Các chuỗi Concatenate sử dụng tham gia như được hiển thị ở trên, sử dụng toán tử + hiệu quả hơn.Phải mất ít thời gian hơn để thực hiện.using the + operator is more efficient. It takes less time for execution.

Concatenation có nhanh hơn tham gia không?

Thực hiện n Concatenations yêu cầu tạo n chuỗi mới trong quá trình.Tham gia (), mặt khác, chỉ phải tạo một chuỗi duy nhất (kết quả cuối cùng) và do đó hoạt động nhanh hơn nhiều.join() , on the other hand, only has to create a single string (the final result) and thus works much faster.

Tham gia nhanh hơn python concatenation?

Chuỗi nối nhanh hơn đáng kể sau đó kết hợp..