Cấu trúc dữ liệu trong javascript

Lưu ý. Mặc dù JavaScript không cần thiết cho trang web này, nhưng sự tương tác của bạn với nội dung sẽ bị hạn chế. Vui lòng bật JavaScript để có đầy đủ trải nghiệm. Mặc dù JavaScript không cần thiết cho trang web này, nhưng sự tương tác của bạn với nội dung sẽ bị hạn chế. Vui lòng bật JavaScript để có trải nghiệm đầy đủ

Nội dung chính Hiển thị

  • Làm thế nào để bạn tạo một biểu tượng trong cấu trúc dữ liệu Python?
  • Có cấu trúc dữ liệu đồ thị trong Python không?
  • Làm thế nào để bạn bắt đầu một biểu đồ trong Python?
  • Làm thế nào để bạn đại diện cho một biểu tượng trong cấu trúc dữ liệu?

Cảnh báo

Trang này ở đây vì lý do lịch sử và nó có thể chứa thông tin lỗi thời hoặc không chính xác

Change the note. 22/2/98, 2/3/98, 4/12/00. Phiên bản này của bài luận này đã sửa một số lỗi trong mã. 10/6/19. Rút lui
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
0 là "gần như tối ưu". 8/11/19. Khắc phục việc sử dụng tình cờ
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
1 thay vì
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
2
Copyright (c) 1998, 2000, 2003, 2019 Python Software Foundation.
All rights reserved.
Licensed under the PSF license.

Đồ thị là mạng bao gồm các nút được kết nối bởi các cạnh hoặc cung. Trong các biểu đồ định hướng, các kết nối giữa các nút có một hướng và được gọi là cung; . Chúng tôi chủ yếu thảo luận về các biểu đồ có hướng. Các thuật toán trong các biểu đồ bao gồm tìm đường dẫn giữa hai nút, tìm đường dẫn rút ngắn nhất giữa hai nút, xác định các chu kỳ trong biểu đồ (một chu kỳ là một đường dẫn không trống từ một nút đến chính nó . v. Đôi khi các nút hoặc cung của biểu đồ có số quan trọng hoặc chi phí liên quan đến chúng tôi và chúng tôi quan tâm đến việc tìm đường đi rẻ nhất

Có các tài liệu đáng kể về thuật toán đồ thị, là một phần quan trọng của toán học riêng biệt. Đồ thị cũng có nhiều ứng dụng thực tế trong thuật toán máy tính. Các ví dụ rõ ràng có thể được tìm thấy trong việc quản lý các mạng, nhưng các ví dụ rất nhiều trong nhiều lĩnh vực khác nhau. Chẳng hạn, các mối quan hệ caller-callee trong một chương trình máy tính có thể được xem như một biểu đồ (trong đó các chu kỳ biểu thị các nút đệ quy và các nút không thể truy cập đại diện cho mã chết)

Ít ngôn ngữ lập trình cung cấp hỗ trợ hỗ trợ trực tiếp cho các biểu đồ dưới dạng dữ liệu và Python cũng không ngoại lệ. Tuy nhiên, đồ thị dễ dàng được xây dựng từ danh sách và từ điển. Chẳng hạn, đây là một biểu đồ đơn giản (tôi không thể sử dụng các bản vẽ trong các cột này, vì vậy tôi viết ra các cung của biểu đồ)

    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
Biểu đồ này có sáu nút (A-F) và tám cung. Nó có thể được biểu diễn bằng cấu trúc dữ liệu Python sau.
    graph = {'A': ['B', 'C'],
             'B': ['C', 'D'],
             'C': ['D'],
             'D': ['C'],
             'E': ['F'],
             'F': ['C']}
Đây là một từ điển có các từ khóa là các nút của biểu đồ. Đối với mỗi từ khóa, giá trị tương ứng là một danh sách chứa các nút được kết nối bởi một cung trực tiếp từ nút này. Điều này đơn giản như nó được (thậm chí đơn giản hơn, các nút có thể được biểu diễn bằng các số thay vì tên, nhưng tên thuận tiện hơn và có thể dễ dàng thực hiện để mang thêm thông tin, chẳng hạn như tên

Vui lòng viết một menu đơn giản để xác định đường dẫn giữa hai nút. Nó lấy một biểu đồ và các nút bắt đầu và kết thúc làm đối số. Nó sẽ trả về một danh sách các nút (bao gồm các nút bắt đầu và kết thúc) bao gồm đường dẫn. Khi không có đường dẫn có thể được tìm thấy, nó không được trả lại. Cùng một nút sẽ không xảy ra nhiều hơn một lần trên đường dẫn được trả về (có nghĩa là nó sẽ không chứa các chu kỳ). Thuật toán sử dụng một kỹ thuật quan trọng được gọi là quay lại. nó lần thử từng khả năng cho đến khi tìm thấy một giải pháp

    def find_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if not graph.has_key(start):
            return None
        for node in graph[start]:
            if node not in path:
                newpath = find_path(graph, node, end, path)
                if newpath: return newpath
        return None
Một lần chạy mẫu (sử dụng biểu tượng ở trên).
    >>> find_path(graph, 'A', 'D')
    ['A', 'B', 'C', 'D']
    >>>
Câu lệnh 'IF' thứ hai chỉ cần thiết trong trường hợp có các nút được liệt kê là điểm cuối cho các cung nhưng không có vòng cung hướng dẫn và không được liệt kê các đồ thị ở tất cả. Các nút như vậy cũng có thể được chứa trong biểu đồ, với một danh sách trống của các vòng cung gửi đi, nhưng đôi khi thuận tiện hơn khi không yêu cầu điều này

Lưu ý rằng trong khi người dùng gọi

    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
2 với ba đối số, nó sẽ tự động gọi với đối số thứ tư. path has been going through. Giá trị mặc định cho các đối số này là danh sách trống, '[]', có nghĩa là không có nút nào được chuyển qua. This object are used to bypass Chu kỳ (lần đầu tiên 'IF' bên trong vòng 'cho'). Đối số 'đường dẫn' không được sửa đổi. gán "đường dẫn = đường dẫn + [bắt đầu]" tạo một danh sách mới. Nếu chúng tôi đã viết "Đường dẫn. Nối (bắt đầu)" thay vào đó, chúng tôi đã sửa đổi biến 'đường dẫn' trong người gọi, với kết quả gây hại. . biểu hiện. )

Thật đơn giản để thay đổi chức năng này để trả về danh sách tất cả các đường dẫn (không có chu kỳ) thay vì đường dẫn đầu tiên mà nó tìm thấy

    def find_all_paths(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return [path]
        if not graph.has_key(start):
            return []
        paths = []
        for node in graph[start]:
            if node not in path:
                newpaths = find_all_paths(graph, node, end, path)
                for newpath in newpaths:
                    paths.append(newpath)
        return paths
Chuyển mẫu.
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
0Một biến thể khác có thể tìm thấy đường dẫn ngắn nhất.
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
1Chuyển mẫu.
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
2Các chức năng này đơn giản như chúng ta nhận được. Tuy nhiên, chúng gần như tối ưu (đối với mã được viết bằng Python). Trong một Python mẫu cột khác, tôi sẽ cố gắng phân tích tốc độ chạy của chúng và cải thiện hiệu suất của chúng, với chi phí nhiều mã hơn

CẬP NHẬT. Eryk Kopczyński chỉ ra rằng các chức năng này không tối ưu. Ngược lại, "Chương trình này chạy trong thời gian theo cấp số nhân, trong khi Find_Shortest_Path có thể được thực hiện trong thời gian tuyến tính bằng cách sử dụng BFS [Tìm kiếm đầu tiên trên chiều rộng]. Hơn nữa, BFS tuyến tính đơn giản hơn. " Eryk Kopczyński chỉ ra rằng các chức năng này không tối ưu. Ngược lại, "chương trình này chạy theo thời gian hàm mũ, trong khi find_shortest_path có thể được thực hiện trong thời gian tuyến tính bằng cách sử dụng BFS [Tìm kiếm theo chiều rộng đầu tiên]. Hơn nữa, một BFS tuyến tính đơn giản hơn. "

    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
3Lưu ý rằng điều này trả về đường dẫn theo định dạng kỳ lạ, ví dụ.
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
4. Cụ thể,
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
5 sẽ đưa ra câu trả lời không chính xác (2, do danh sách bên ngoài có độ dài 2). Điều này là do phần phụ được thực hiện là
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
6 thay vì
    A -> B
    A -> C
    B -> C
    B -> D
    C -> D
    D -> C
    E -> F
    F -> C
7. Phương pháp thứ hai sẽ sử dụng thời gian và bộ nhớ bậc hai, nhưng vẫn sẽ ổn định đối với các biểu đồ tương đối nhỏ;

Một biến thể khác sẽ được thêm nhiều dữ liệu dữ liệu. tạo một lớp để hiển thị các biểu đồ, có các phương thức thực hiện các thuật toán khác nhau. Mặc dù điều này hấp dẫn dẫn đến mong muốn thiết lập chương trình có cấu trúc, nhưng nó không làm cho mã hiệu quả hơn (ngược lại). Nó giúp việc bổ sung các nhãn khác nhau vào các nút hoặc nút cũng dễ dàng hơn và bổ sung các thuật toán đưa các nhãn đó vào tài khoản (ví dụ:. để tìm tuyến đường ngắn nhất giữa hai thành phố trên bản đồ). Điều này cũng vậy, sẽ là chủ đề của một cột khác

Làm thế nào để bạn tạo một biểu tượng trong cấu trúc dữ liệu Python?

Cấu trúc dữ liệu đồ thị. .

Đỉnh. Một đỉnh là phần cơ bản nhất của biểu đồ và nó còn được gọi là nút.

Bờ mở. Một bên là một phần cơ bản khác của biểu đồ và nó kết nối hai đỉnh/ Bên cạnh có thể là một chiều hoặc hai chiều.

Trọng lượng. Các cạnh có thể được cân nhắc để cho rằng có một chi phí để đi từ đỉnh này sang đỉnh khác.

Đồ thị.

Đường dẫn.

Đi xe đạp

Có cấu trúc dữ liệu đồ thị trong Python không?

Cấu trúc dữ liệu mà tôi thấy là hữu ích và hiệu quả nhất cho các biểu thức trong Python là một điều kiện của các bộ. Đây sẽ là cấu trúc cơ bản cho lớp đồ thị của chúng tôi. Bạn phải biết các kết nối này là ARC (được định hướng, kết nối một chiều) hoặc các Cạnh (không được mong muốn, kết nối cả hai chiều). một tập hợp . Đây sẽ là cấu trúc cơ bản cho lớp Graph của chúng ta. Bạn cũng phải biết liệu các kết nối này là hình cung (có hướng, kết nối theo một chiều) hay cạnh (không có hướng, kết nối theo cả hai chiều).

Làm thế nào để bạn bắt đầu một biểu đồ trong Python?

Create a dictionary dictionary trong Python

Đồ thị và các biểu tượng của nó

Thực hiện hiển thị đồ thị bằng STL để thiết lập cận cảnh. Đặt 1 (DFS of does not have a important number and does not being image effect)