Cấu trúc dữ liệu phức tạp nhất bạn đã sử dụng trong một tình huống thực tế là gì? [đóng cửa]


16

Mầm mống cho câu hỏi này xuất phát từ một cuộc thảo luận mà tôi đang có với một vài nhà phát triển đồng nghiệp trong ngành.

Hóa ra ở nhiều nơi, các nhà quản lý dự án cảnh giác với các cấu trúc dữ liệu phức tạp và thường nhấn mạnh vào bất cứ thứ gì tồn tại bên ngoài từ thư viện / gói tiêu chuẩn. Ý tưởng chung có vẻ giống như sử dụng kết hợp những thứ đã có sẵn trừ khi hiệu suất bị cản trở nghiêm trọng. Điều này giúp giữ cho cơ sở mã đơn giản, mà đối với người không ngoại giao có nghĩa là "chúng tôi có sự tiêu hao cao, và những người mới hơn chúng tôi thuê có thể không tốt như vậy".

Vì vậy, không có bộ lọc nở hoặc danh sách bỏ qua hoặc splay cây cho bạn CS CS. Vì vậy, đây là câu hỏi (một lần nữa): Cấu trúc dữ liệu phức tạp nhất bạn đã làm hoặc sử dụng trong văn phòng là gì?

Giúp hiểu được phần mềm thế giới thực tốt / tinh vi như thế nào.


Viết bởi người khác, hay bởi chính chúng ta?

Mục đích ban đầu của tôi là bất cứ điều gì tự phát triển, nhưng tôi nghĩ rằng nó bổ sung một khía cạnh thú vị cho câu hỏi. Chỉnh sửa câu hỏi gốc.
Fanatic23

Làm cho nó phức tạp không có nghĩa là nó tinh vi. Đơn giản hơn = tốt hơn luôn.
tp1

Những cái phức tạp nhất luôn có sẵn từ STL. Sự phức tạp thường đến từ các cấu trúc dữ liệu lồng nhau, không phải từ kiểu của chúng. Cấu trúc đơn giản = tốt, trừ khi hồ sơ phàn nàn.
Coder

-1 để đánh giá giá trị không cần thiết. Tôi có thể nói nhiều như vậy: trong những ngày này, nếu bạn tự thực hiện các cơ sở dữ liệu, bạn sẽ thật ngu ngốc và bướng bỉnh. Đừng là đứa trẻ thông minh tiếp theo nghĩ rằng mình có thể triển khai cơ sở hạ tầng sai cách.
Pieter B

Câu trả lời:


7

Đã sử dụng danh sách bỏ qua để tra cứu. Nơi tôi làm việc, có một triển khai tiêu chuẩn và mọi người được khuyến khích sử dụng nó. Đã sử dụng patricia cố gắng lưu trữ và truy xuất địa chỉ IP một cách hiệu quả. Một lần nữa thực hiện đã có mặt.


7

Tôi là nhà phát triển Java. Java Collection Framework có thể giải quyết 90% các vấn đề về cấu trúc dữ liệu của tôi, 10% khác cần nỗ lực. Tôi nghĩ rằng nếu bạn thực sự hiểu lib tiêu chuẩn tinh vi được viết bởi các chuyên gia, bạn sẽ thấy họ giúp đỡ trong hầu hết các trường hợp.

Cấu trúc dữ liệu phức tạp rất khó để duy trì trong thế giới thực. Để tránh làm rối mã, tôi sẽ chia một rắc rối cho một số nhỏ hơn. Mỗi vấn đề nhỏ có thể được giải quyết bằng Khung sưu tập Java . Có thể giải pháp không phải là thông minh nhất (nó cần nhiều bộ nhớ hơn và chậm hơn), nhưng nó hoạt động và dễ bảo trì. Đó là sự đánh đổi.

Nếu tôi phải viết cấu trúc dữ liệu phức tạp, tôi sẽ chọn sách giáo khoa :)


4

Cấu trúc dữ liệu phức tạp nhất mà tôi đã sử dụng trong công việc là một bộ ba. Tuy nhiên, đó là hai mươi năm trước.

Vấn đề với sự phát triển phần mềm công nghiệp là hầu hết các lập trình viên công nghiệp không phải là sinh viên khoa học máy tính (CompSci); do đó, các kỹ thuật mà cấp độ CompSci trung bình đạt được được coi là quá khó đối với các lập trình viên bánh mì và bơ.

Thiếu kiến ​​thức CompSci chung trong ngành là một vấn đề nghiêm trọng. Ví dụ: tôi đã mất số lượng nhà phát triển phần mềm mà tôi đã gặp, những người không hiểu các biểu thức đó như! (A! = 5 && b! = 3) và a == 5 || b == 3 tương đương logic. Bất cứ ai biết cách áp dụng Định lý DeMorgan đều có thể nhận ra rằng các biểu thức này là tương đương về mặt logic. Hầu hết sinh viên tốt nghiệp không phải CompSci chưa bao giờ nghe nói về Định lý DeMorgan. Nếu một người khảo sát bất kỳ cơ sở mã đáng kể nào, người ta sẽ tìm thấy nhiều lần xuất hiện của các biểu thức phủ định các biểu thức logic logic phủ định. Khả năng đọc mã chứa các biểu thức logic phủ định phủ định hầu như luôn được cải thiện bằng cách chuyển đổi các biểu thức này thành dạng không phủ định của chúng.


5
Lời khuyên của tôi cho bất cứ ai bỏ phiếu "xuống" là người ta nên thêm một bình luận nêu rõ lý do tại sao một người bỏ phiếu "xuống". Tôi có thể xử lý ai đó có ý kiến ​​khác. Tuy nhiên, những gì tôi không thể xử lý là hèn nhát.
bit-twiddler

2
@ bit-twiddler Tôi đã học Định lý De Morgan ở mức độ Triết học của tôi. Bây giờ tôi đang làm CS, nó đã không được đề cập. Thành thật mà nói, tôi thấy những thứ này là một tốc ký tốt nhất đi kèm với kinh nghiệm. Bạn có thực sự cần phải nhớ các quy tắc (và theo tên!) Bạn sử dụng khi tính hệ số không? Tôi không biết về bạn, nhưng tôi giải quyết nó dựa trên những gì trước mặt tôi chứ không phải bằng vẹt. Điều tương tự cũng xảy ra đối với việc sửa đổi các biểu thức logic.
Rupert Madden-Abbott

2
@Rupert: Định lý của De Morgan thường được đề cập trong tổ chức toán và máy tính rời rạc (cả hai đều là các khóa học đại học bắt buộc ở Mỹ). Tôi tập trung vào phần mềm kiến ​​trúc / hệ thống máy tính như một sinh viên chưa tốt nghiệp. Định lý của De Morgan được sử dụng nhiều trong thiết kế logic kỹ thuật số. Có những lĩnh vực trong phát triển phần mềm cấp thấp nơi việc biết Định lý của De Morgan trở nên quan trọng. Ví dụ, có các máy tính tập lệnh tối thiểu không chứa đầy đủ các lệnh Boolean; do đó, người ta phải có thể rút ra một hoạt động Boolean từ một hoạt động khác.
bit-twiddler

1
(cont) Đây là một bài kiểm tra mà hầu hết các sinh viên khoa học máy tính / kỹ thuật máy tính / kỹ thuật điện (tập trung kỹ thuật máy tính) đều không hoàn toàn hoặc mất nhiều thời gian để trả lời. Chỉ đưa ra hoạt động NAND (phủ định), rút ​​ra các hoạt động Boolean sau: KHÔNG, AND, OR, NOR, XOR và XNOR. Biết định lý của De Morgan giúp cho việc thực hiện sáu hoạt động Boolean đó dễ dàng hơn nhiều. Định lý De Morgan dễ dàng là định lý quan trọng nhất trong thiết kế logic kỹ thuật số.
bit-twiddler

1
..... mặc dù công bằng mà nói, trong một ngành mà RẤT NHIỀU công việc viết các ứng dụng RoR nửa khẳng định cho một số doanh nghiệp nhỏ, có lẽ khoảng 1 lần trong 1000000000, bạn thậm chí sẽ cần phải có TRÁI TIM khái niệm về cổng logic và đại số boolean, thay vì chỉ biết nghĩa của các từ tiếng Anh "hoặc" và "và". không nói những điều này không liên quan để biết nếu bạn đang làm công việc CS hay thuật toán phức tạp hoặc tối ưu hóa hoặc lập trình cấp thấp, nhưng đối với phần lớn những người làm việc như lập trình viên, đó là những chuyện vặt vãnh vô dụng.
sara

2

Tôi đã từng viết một hàng đợi lịch (O (1) hàng đợi ưu tiên) cho một mô phỏng dựa trên sự kiện trong đó hồ sơ cho thấy heap hiện tại là một nút cổ chai.

Tôi cũng đã phát hành một sản phẩm có chứa một máy trạng thái hữu hạn với khoảng 80000 trạng thái - mã để tạo ra nó hơi khó hiểu, để nói rằng ít nhất.


2

Lâu rồi, lâu rồi, trong một thiên hà ... Làm việc trong một nhóm sử dụng "bộ đệm bạn thân" của Knuth trong một RTOS trong trình biên dịch chương trình.

Ngoài ra, Trò chơi cuộc sống của Conway với 256 thế hệ cho thế giới 1024 x 1024.


1

Không thực sự sử dụng bất cứ điều gì quá đặc biệt, từ đầu nó sẽ là một danh sách liên kết đôi .

Không thú vị lắm, tôi đã sử dụng các cấu trúc khác. Nhưng câu hỏi của bạn nói từ đầu.


trong C ++, điều std::listđó thực sự không có gì phức tạp: / Tôi thấy cây đỏ-đen / cây AVL phức tạp hơn nhiều, với tất cả các điều kiện cân bằng lại!
Matthieu M.

@Mathieu std :: map và rất có thể bạn sẽ nhận được một cây rb.
aufather

1

Một cây hashtables chứa danh sách chung về dữ liệu tài chính - thậm chí không hỏi. Đôi khi tôi ước mình là một chàng cao bồi. Ah, cuộc sống đơn giản dưới những vì sao ...


tháo kính ra "Chúa ơi."
Len Joseph

1

Tôi đã phải viết một cấu trúc Danh sách liên kết đôi thông tư từ đầu cho Thuật toán liên kết nhảy múa cho người giải Sudoku. Nó giống như thiết kế một khối Rubik. Toàn bộ cấu trúc về cơ bản là một danh sách các danh sách - với mỗi nút trỏ đến bốn nút khác.


1
Nghe có vẻ như quá mức cần thiết cho người giải Sudoku, vì thuật toán quay lui mạnh mẽ giải quyết câu đố nhanh hơn bạn có thể nhập dữ liệu.
kevin cline

3
@kevin, nhảy liên kết là một thuật toán quay lui mạnh mẽ - nhưng với một heuristic hợp lý.
Peter Taylor

Bạn cần một heuristic nếu bạn sẽ làm những việc như liệt kê tổng số giải pháp và khẳng định rằng Sudoku chỉ có 1 giải pháp duy nhất.
ProdigySim

1

Tôi đã từng sử dụng một cây chiều dài đường dẫn có trọng số cho một bộ đệm chuyên dụng. Đó là niềm vui. Cũng đã viết các thói quen quản lý heap của riêng tôi để malloc()thay thế, nhưng rất nhiều người đã làm điều đó.


0

Suy nghĩ kỹ, cấu trúc dữ liệu "phức tạp" nhất mà tôi đã thực hiện từ đầu là mô hình hóa một mạng lưới các yếu tố dựa trên danh sách liên kết đôi. Nhưng đó là những năm trước đây khi tôi từng làm lập trình cấp hệ thống.

Ngày nay tôi hầu như không tạo ra bất kỳ cấu trúc dữ liệu ưa thích nào. Hầu hết xảy ra trong cơ sở dữ liệu nơi bạn quyết định những gì bạn đặt vào bảng, có thể một số giá trị được tính toán trước có lẽ là ID của một số bản ghi liên quan để truy xuất nhanh để tránh tra cứu không cần thiết.

Cá nhân tôi điều rằng nhiệm vụ trong tay xác định các phương tiện. Tại sao phải cố gắng sử dụng một số cấu trúc dữ liệu kỳ lạ nếu không có sử dụng cho nó? Và nếu tôi có thể nói trong hầu hết các chương trình ứng dụng thực tế, có lẽ không cần phải phát minh lại bánh xe.


Ý định của tôi là không ép buộc một số cấu trúc dữ liệu kỳ lạ. Nhưng đó là một tình huống đáng buồn khi bạn cần một cái gì đó vượt trội và phải đối phó với bất cứ điều gì đã có sẵn chỉ vì chính sách của công ty ra lệnh như vậy.
Fanatic23

0

Có một hàng đợi ưu tiên tính? Điều đó xuất hiện chỉ trong mỗi ứng dụng thời gian thực mà tôi đã viết. Nó đã trở thành một phần của thư viện Java tiêu chuẩn chỉ gần đây (Java 1.5).

Ngoài ra, tôi không thể nghĩ ra bất cứ điều gì phức tạp mà tôi thực sự muốn rằng tôi không thể rút ra khỏi thư viện. Tôi sẽ không để điều đó ngăn cản tôi, nhưng tôi sẽ hỏi tại sao tôi cần một cấu trúc dữ liệu quá kỳ lạ đối với các thư viện. Tôi chắc chắn sẽ tìm kiếm một triển khai mã nguồn mở hiện có của bộ lọc trie hoặc bộ lọc nở hoặc danh sách bỏ qua trước khi tôi thử tự viết.

Nói chung, tôi đồng ý với người quản lý của bạn rằng chi phí xây dựng và duy trì cấu trúc dữ liệu tùy chỉnh quá bí truyền để không có phiên bản thư viện có thể vượt trội hơn bất kỳ lợi ích hiệu suất nào có được từ nó. Tôi muốn bạn thể hiện, thông qua hồ sơ, rằng các cấu trúc thư viện đơn giản đang gây ra một hình phạt hiệu suất đáng kể trước khi tôi cho phép bạn tiếp tục và tối ưu hóa chúng với một cái gì đó lạ mắt. Bởi vì theo nguyên tắc chung, mua chu kỳ bộ xử lý rẻ hơn chu kỳ kỹ thuật.

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.