cuốn sách gpt4 ai đã làm

Cái nào nhanh hơn, sắp xếp một vectơ rồi đặt nó vào cây AVL hay gõ trực tiếp?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 08:15:20 25 4
mua khóa gpt4 Nike

Tình hình là thế này:

Tôi có hàng triệu (có thể là hàng tỷ) chuỗi mà tôi đang cố phân tích cú pháp và đưa vào cấu trúc được sắp xếp, giả sử tôi có 5.000.000 chuỗi. Tôi đang cố gắng viết một chương trình nhanh có thể đặt tất cả các chuỗi này từ một vectơ chưa được sắp xếp vào cấu trúc dữ liệu có thứ tự cũng có thể được tìm kiếm nhanh chóng cho các cấu trúc, do đó suy luận về cây AVL (cuối cùng tôi dự định sử dụng ha az cho bảng băm để tra cứu nhanh hơn, nhưng điều đó sẽ đến sau). Đầu tiên tôi đặt tất cả các chuỗi vào một vectơ nhưng chúng đều lộn xộn, không được sắp xếp và có độ dài khác nhau. Tôi không muốn bất kỳ chuỗi trùng lặp nào xuất hiện trong cây của mình, vì vậy nếu chương trình tìm thấy các chuỗi "hello" và "hello", nó sẽ chỉ có một mục nhập AVL và một giá trị giữ số nguyên sẽ được tăng lên để biểu thị sự xuất hiện của chuỗi đó Tính thường xuyên.

Vì vậy, câu hỏi của tôi là: trước tiên có thể sắp xếp vectơ nhanh hơn (sử dụng thứ gì đó như sắp xếp nhanh đa luồng hoặc sắp xếp nhanh khác) rồi đưa nó vào cây AVL, sau khi tất cả các từ được sắp xếp cùng với các từ khác? hoặc sẽ nhanh hơn nếu chỉ đặt tất cả dữ liệu trong vectơ chưa được sắp xếp vào cây AVL và tiếp tục kiểm tra cây AVL để xem liệu một từ đã tồn tại chưa rồi tăng nó lên.

Vì vậy có hai tình huống để mô tả nó theo thứ tự thực hiện:

TRƯỜNG HỢP A:

> Nhận chuỗi đầu vào/phân tích
> Đặt chuỗi vào vector (chưa sắp xếp)
> Đưa vector vào mảng hoặc danh sách liên kết
> Sắp xếp nhanh mảng/danh sách đó
> Nhập mảng đã sắp xếp đó vào Cây AVL

TRƯỜNG HỢP B:

> Nhận chuỗi đầu vào/phân tích
> Đặt chuỗi vào vector (chưa sắp xếp)
> Chèn dữ liệu vector vào cây AVL
> Trong quá trình chèn, kiểm tra xem có từ nào trùng lặp không, nếu có thì tăng bộ đếm

Trường hợp nào nhanh hơn? ?

--biên tập-- Vì vậy, sau khi nghe một số nhận xét, sẽ là một ý tưởng tồi nếu chèn một mảng đã sắp xếp vào cây AVL ngay từ đầu, với số lượng phép quay sẽ hợp lý. Có vẻ như chèn trực tiếp vào cây AVL có thể là một ý tưởng hay, nhưng cách tốt nhất để chèn hiệu quả khi một từ đã ở đâu đó trong cây là gì? Làm thế nào tôi có thể chắc chắn rằng tôi tìm thấy nó? Đây có phải là nơi việc sắp xếp của tôi có thể phát huy tác dụng không?

câu trả lời hay nhất

Hãy suy nghĩ về cách cân bằng cây AVL. Nó hoạt động tốt nhất nếu "giá trị trung bình" đến trước. Với đầu vào được sắp xếp, bạn sẽ cần phải cân bằng lại rất nhiều, vì vậy việc sắp xếp trước có thể gây hại nhiều hơn là có lợi.

Ví dụ: hãy xem xét cây AVL sau chứa các giá trị 1-6:

    4
/ \
2 5
/ \ \
1 3 6

Nếu thứ tự đầu vào là 4, 2, 5, 1, 3, 6, bạn không bao giờ cần một cây cân bằng. Ngược lại, đối với đầu vào được sắp xếp 1, 2, 3, 4, 5, 6, bạn sẽ cần nhiều thao tác tái cân bằng:

  1 +3 2 +4 2 +5 2 +6 3
\ ---> / \ ---> / \ ---> / \ ---> / \
2 1 3 1 3 1 4 2 5
\ / \ / / \
4 3 5 1 4 6

gia hạn Câu hỏi ban đầu là liệu việc sắp xếp dữ liệu trước khi chèn vào cây AVL có cải thiện hiệu suất hay không. Bây giờ OP đã chỉnh sửa câu hỏi để chuyển sang câu hỏi cụ thể của mình.

nhưng cách tốt nhất để chèn một cách hiệu quả khi một từ đã có trong cây ở đâu đó? Làm cách nào để đảm bảo rằng tôi tìm thấy nó?

Mục đích chung của cây AVL là tìm kiếm dữ liệu một cách hiệu quả, nên tôi không hiểu vấn đề. Rõ ràng là làm thế nào để duyệt qua cây tìm kiếm nhị phân để tìm một giá trị. Tại sao bạn cần sắp xếp dữ liệu cho việc này?

Lưu ý rằng cây tìm kiếm nhị phân là một nơi lưu trữ tốtchìa khóacấu trúc dữ liệu nhưng nó cũng có thể quản lý dữ liệu tùy ý liên quan đến các khóa này. Trong trường hợp của bạn, bạn muốn lưu trữ số lượng cùng với khóa. Vì vậy, bạn không cần cây từ/chuỗi mà là cây các cặp (chuỗi, số nguyên) biểu thị các từ và số đếm của chúng. Để sắp xếp cây, chỉ cần xem xét các khóa chuỗi, tức là các từ.

Đối với mỗi từ được chèn vào, hãy tra cứu nó trong cây. Nếu nó đã tồn tại, hãy cập nhật số từ. Nếu không, hãy chèn một cặp mới có số từ là 1.

Một lưu ý cuối cùng: thư viện chuẩn C++ đi kèm với một bản đồ Loại, thường (luôn luôn?) được triển khai bằng cây cân bằng (AVL hoặc đỏ-đen). Chỉ cần sử dụng cách triển khai này sẽ giúp bạn tiết kiệm rất nhiều công sức và sửa lỗi. Kể từ C++ 11, cũng có một không có thứ tự_map, thường (luôn luôn?) được triển khai bằng bảng băm.

Về c++ - Cái nào nhanh hơn, sắp xếp một vectơ rồi đặt nó vào cây AVL hoặc gõ trực tiếp? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/27100192/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress