Hướng dẫn python for competitive programming - python để lập trình cạnh tranh
Vào năm 2017, khi ACM cho phép Python hỗ trợ cho sự cạnh tranh uy tín của mình, ACM ICPC, một cộng đồng hoàn toàn mới bắt đầu quan tâm đến môn thể thao lập trình cạnh tranh. Điều này có nghĩa là nhiều người trở lại với những điều cơ bản, các thuật toán học là các khối xây dựng của các gói phức tạp mà họ sử dụng để xây dựng các gói cấp cao của chúng. Thật không may, không có nhiều thông tin tồn tại về cách sử dụng hiệu quả các cấu trúc dữ liệu và thậm chí cả phạm vi Các quy tắc của Python khiến mọi người tin rằng Python là phụ để lập trình cạnh tranh. Tôi sẽ cho bạn thấy Python đôi khi thậm chí còn mạnh hơn C ++ hoặc Java nhờ các thư viện tuyệt vời của nó và nó thực sự có thể đơn giản như thế nào. Show Hãy để tôi trình bày với một ví dụ đơn giản, hãy xem các đoạn mã sau Các [110, 95, 90] [20, 25, 33, 38]3 [110, 95, 90] [20, 25, 33, 38]4 [110, 95, 90] [20, 25, 33, 38]5 [110, 95, 90] [20, 25, 33, 38]6 [110, 95, 90] [20, 25, 33, 38]7 [110, 95, 90] [20, 25, 33, 38]8 [110, 95, 90] [20, 25, 33, 38]9 Các [110, 95, 90] [20, 25, 33, 38]3 [110, 95, 90] [20, 25, 33, 38]4 [110, 95, 90] [20, 25, 33, 38]5 [110, 95, 90] [20, 25, 33, 38]6 [110, 95, 90] [20, 25, 33, 38]3 [110, 95, 90] [20, 25, 33, 38]4 [110, 95, 90] [20, 25, 33, 38]5 [110, 95, 90] [20, 25, 33, 38]6 [20, 60, 150]6 [20, 60, 150]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]9 = [110, 95, 90] [20, 25, 33, 38]8 So i wrote a performance testing function as follows. Bạn có thể nghĩ rằng tôi đã gán một bí danh cho hàm ‘Len, và nó có thể không tạo ra sự khác biệt. Vì vậy, tôi đã viết một chức năng kiểm tra hiệu suất như sau. [20, 60, 150]8 [20, 60, 150]9
[110, 95, 90] [20, 25, 33, 38]3 [110, 95, 90] [20, 25, 33, 38]4 [110, 95, 90] [20, 25, 33, 38]5 [110, 95, 90] [20, 25, 33, 38]6 [110, 95, 90] [20, 25, 33, 38]7 [110, 95, 90] [20, 25, 33, 38]8 [ 1[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]9 = [110, 95, 90] [20, 25, 33, 38]8 Bạn có thể nghĩ rằng tôi đã gán một bí danh cho hàm ‘Len, và nó có thể không tạo ra sự khác biệt. Vì vậy, tôi đã viết một chức năng kiểm tra hiệu suất như sau. [20, 60, 150]8 [20, 60, 150]9
[110, 95, 90] [20, 25, 33, 38]7 [20, 60, 150]7
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]9 = ________ 18 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;[110, 95, 90] [20, 25, 33, 38]3 [110, 95, 90] [20, 25, 33, 38]4 [110, 95, 90] [20, 25, 33, 38]5 [110, 95, 90] [20, 25, 33, 38]6 In the second snippet, I stored the function directly in the scope of the function, so it doesn’t matter how many times I call it, each time the runtime knows exactly where it has to look for the results.
Tôi khuyến khích bạn thử nó trên các hệ thống của bạn. Đây là đầu ra của tôi khi chạy tập lệnh hiệu suất. Gần một nửa! Được rồi, bây giờ hãy để cố gắng phân tích lý do tại sao điều này xảy ra. Lý do? Tra cứu một chức năng là một hoạt động tốn kém. Trong đoạn trích thứ hai, tôi đã lưu trữ chức năng trực tiếp trong phạm vi của hàm, vì vậy tôi không quan trọng bao nhiêu lần, mỗi lần thời gian chạy biết chính xác nó phải nhìn cho kết quả. Itertoolsif bạn đã từng đến CodeForces, bây giờ bạn biết rằng rất nhiều thách thức lập trình liên quan đến việc quay lại. Vì vậy, hôm nay tôi sẽ nói với bạn về một thư viện để tạo tất cả các hoán vị và kết hợp bằng cách sử dụng gói thư viện sẵn có cực kỳ nhanh. Itertools. Nếu bạn đang tìm cách giải quyết các thách thức thuật toán với Python thì itertools là thư viện, bạn chắc chắn phải khám phá. Để tạo ra tất cả các hoán vị -
Kết hợp danh sách các chuỗi & nbsp; giả sử chúng tôi đã được cung cấp một danh sách các chuỗi và chúng tôi phải đưa ra đầu ra bằng cách kết hợp danh sách & nbsp; hãy để xem mã trước đó những gì chúng tôi đang làm:
PythonCác [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]51 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]52 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]54 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]55 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]56 'b' 7[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]58 = [110, 95, 90] [20, 25, 33, 38]06 alphabets 9[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]62 ____263
[110, 95, 90] [20, 25, 33, 38]61 Output: Ở đây, chúng tôi vừa triển khai một hàm đơn giản nhân lên mỗi giá trị danh sách với hai và trả về nó dưới dạng danh sách mới.
Python[20, 60, 150]8 [110, 95, 90] [20, 25, 33, 38]63 [110, 95, 90] [20, 25, 33, 38]64___
[110, 95, 90] [20, 25, 33, 38]88 'b' 9[110, 95, 90] [20, 25, 33, 38]90
[110, 95, 90] [20, 25, 33, 38]92 [110, 95, 90] [20, 25, 33, 38]22 [110, 95, 90] [20, 25, 33, 38]90 Output: [110, 95, 90] [20, 25, 33, 38]
Python[20, 60, 150]8 [110, 95, 90] [20, 25, 33, 38]63 [110, 95, 90] [20, 25, 33, 38]64___ Dòng đầu ra đầu tiên cung cấp 3 số số lớn nhất có trong các lớp danh sách. Tương tự, dòng thứ hai của đầu ra in ra 4 trong số các yếu tố nhỏ nhất có trong các lớp danh sách. Một đặc sản khác của chức năng này là nó không bỏ qua sự lặp lại. Vì vậy, thay cho n nếu chúng ta đặt chiều dài của mảng thì chúng ta sẽ kết thúc với toàn bộ mảng được sắp xếp !! Từ điển và khái niệm về từ điển Zipping & NBSP; Từ điển trong Python thực sự hấp dẫn về chức năng độc đáo mà họ cung cấp. Chúng được lưu trữ như một cặp khóa và giá trị dưới dạng cấu trúc giống như mảng. Mỗi giá trị có thể được truy cập bằng khóa tương ứng của nó. & NBSP; hàm zip được sử dụng để kết hợp hai danh sách với nhau hoặc thậm chí chúng ta có thể tham gia các cặp khóa và giá trị trong một từ điển với nhau như một danh sách duy nhất. Ứng dụng của khái niệm này sẽ được làm rõ trong đoạn mã sau. [110, 95, 90] [20, 25, 33, 38]97 = [110, 95, 90] [20, 25, 33, 38]99 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]01 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]02 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]03 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]04 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]06 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]02 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]08 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]04 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]25 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]11 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]02213 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]04
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]32 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]33 [110, 95, 90] [20, 25, 33, 38]7 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]16 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]02 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]18 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]04
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]32 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]41 Output: [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]
Python[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]26 = [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]28 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]29 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]34 = [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]28 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]37 Hàm bản đồ. & NBSP; Hàm này là một lối tắt nhỏ lén lút cho phép chúng tôi thực hiện một hàm đơn giản trên danh sách các giá trị theo cách rất độc đáo. Ví dụ sau đây sẽ đưa ra một ứng dụng đơn giản của chức năng này. Hàm lấy làm tham số Tên hàm và tên của danh sách chức năng cần được áp dụng. Các
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]65 Output: [20, 60, 150]
Python[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]58 = [110, 95, 90] [20, 25, 33, 38]06 alphabets 9[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]62 ____263 Ở đây, chúng tôi vừa triển khai một hàm đơn giản nhân lên mỗi giá trị danh sách với hai và trả về nó dưới dạng danh sách mới. Kết hợp danh sách các chuỗi & nbsp; giả sử chúng tôi đã được cung cấp một danh sách các chuỗi và chúng tôi phải đưa ra đầu ra bằng cách kết hợp danh sách & nbsp; hãy để xem mã trước đó những gì chúng tôi đang làm: [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]66 = [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]68
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]88 Các PythonỞ đây, chúng tôi vừa triển khai một hàm đơn giản nhân lên mỗi giá trị danh sách với hai và trả về nó dưới dạng danh sách mới. Kết hợp danh sách các chuỗi & nbsp; giả sử chúng tôi đã được cung cấp một danh sách các chuỗi và chúng tôi phải đưa ra đầu ra bằng cách kết hợp danh sách & nbsp; hãy để xem mã trước đó những gì chúng tôi đang làm:
[(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]88 [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]66 = [(39.28, 'yhoo'), (76.45, 'FB'), (99.76, 'APPL'), (306.21, 'AMZN'), (520.54, 'Goog')] [('AMZN', 306.21), ('APPL', 99.76), ('FB', 76.45), ('Goog', 520.54), ('yhoo', 39.28)]68join() function is memory efficient as well as handy to write which definitely proves to be the advantages over the previous code. Các |