2009-12-07 40 views
9

Tôi đã nghiên cứu cấu trúc dữ liệu cơ bản của mình một loạt gần đây, cố gắng đảm bảo rằng tôi đã khiến chúng bị lạnh.Danh sách các cấu trúc dữ liệu cơ bản - tôi thiếu gì?

Bởi "cơ bản", tôi có nghĩa là những cơ bản thực sự. Những cái ưa thích như Red-Black Trees và Bloom Filters rất đáng được biết, nhưng chúng thường là những cải tiến cơ bản (Red-Black Trees là cây tìm kiếm nhị phân với các thuộc tính đặc biệt để giữ chúng cân bằng) hoặc chúng chỉ hữu ích trong tình huống cụ thể (Bloom Filters).

Cho đến nay, tôi là "thông thạo" trong cấu trúc dữ liệu sau đây:

  • Mảng
  • danh sách liên kết
  • Stacks/Queues
  • Binary Search Trees
  • Heaps Queues/ưu tiên
  • Bàn băm

Tuy nhiên, tôi cảm thấy như tôi đang thiếu một cái gì đó. Có những thứ cơ bản mà tôi quên không?

EDIT: Thêm những sau khi đăng câu hỏi

  • Strings (được đề xuất bởi catchmeifyoutry)
  • Sets (được đề xuất bởi Peter)
  • đồ thị (được đề xuất bởi Nick D và AJ)
  • B-Trees (Được đề xuất bởi tloach)
    • Tôi là một chút trên hàng rào về việc liệu những ar e quá ưa thích hay không, nhưng tôi nghĩ rằng chúng đủ khác biệt với các cấu trúc cơ bản (và đủ quan trọng) để có giá trị học tập cơ bản.
+2

đống và hàng đợi PRIO có thể được phân loại như ưa thích: P –

+1

Có lẽ bất cứ điều gì ngoài mảng và danh sách liên kết có thể được phân loại như ưa thích: P – jakeboxer

+1

'fancyness' là gần như chắc chắn là một quy mô tương tự chứ không phải là một sự lựa chọn nhị phân, nếu nó thậm chí có thể được xác định rõ. –

Trả lời

9

Sets

Như một nguyên tắc tôi không bao giờ nói thử [anySearhEngine] vào nó, nhưng bạn có thể kiểm danh sách này: http://en.wikipedia.org/wiki/List_of_data_structures

+0

Tập hợp là cấu trúc mô hình hóa nhiều hơn cấu trúc dữ liệu cơ bản. –

+4

IMHO nó là một cấu trúc dữ liệu rất cơ bản – Peter

+0

Oh wow. Tôi đã tìm kiếm những thứ như thế này (cả trên Wikipedia và Google), nhưng bằng cách nào đó tôi đã không đụng vào danh sách này. Cám ơn rất nhiều. – jakeboxer

0

Bạn đã quên những cái cơ bản: struct, objectenums.

+0

Các cấu trúc này là ngôn ngữ cụ thể và có thể được sắp xếp theo thứ tự các kiểu cơ bản. –

+0

Tôi xem đây là các kiểu dữ liệu chứ không phải cấu trúc dữ liệu. Tôi tưởng tượng có những tranh luận tuyệt vời ở cả hai phía, nhưng tôi cũng biết những điều này, vì vậy nó không liên quan đến mục đích của tôi. Gọi tốt mặc dù :) – jakeboxer

+0

Cấu trúc là một loại ánh xạ từ tên đến giá trị. Trong khi ngôn ngữ C 'struct' là ngôn ngữ cụ thể. Các "bản ghi" (trong COBOL hoặc Pascal parlance) không tồn tại trong nhiều ngôn ngữ. Đây là cơ sở cho các định nghĩa "lớp". Vì vậy, tôi sẽ lập luận rằng nó không phải là ngôn ngữ cụ thể, nhưng tồn tại gần như ở khắp mọi nơi. –

4

B-Cây và các loại cây khác

+0

B-Cây được che phủ, bạn có ngụ ý những cái ưa thích không? –

+0

Vainstah: B-Cây khác với Cây tìm kiếm nhị phân. Tốt tloach gọi, nó được một thời gian kể từ khi tôi đã làm mới bản thân mình trên những người. – jakeboxer

+0

Trong trường hợp đó, họ nên được ưa thích theo định nghĩa của mình. –

0

Tôi sẽ thêm bản đồ trừ khi bạn muốn xem xét việc đặt trong bộ.

0

Matrices vì chúng làm cơ sở cho các vấn đề xây dựng mô hình như:

  • Đồ thị
  • Affine Transformations
  • Giải quyết các hệ thống tuyến tính chuỗi
  • Markov
  • vv
+0

Không phải imo cơ bản vì chúng có thể được mô phỏng bằng các mảng. –

+0

những gì không thể được mô phỏng bằng cách sử dụng mảng? –

+0

@jk mọi thứ có thể, có lẽ bạn nên thay đổi câu trả lời thành ma trận "thưa thớt". Đây không nên được mô phỏng bằng cách sử dụng mảng và tôi nghĩ là cơ bản. –

10

Cũng Graph data structure là cơ bản.

+0

Đồ thị là cấu trúc chính xác và cấu trúc dữ liệu. +1 –

+0

Tuyệt vời. Tôi đã nghiên cứu các thuật toán đồ thị khác nhau, nhưng tôi nên tự làm mới cấu trúc dữ liệu. – jakeboxer

0

Để được trợ giúp, hãy đọc tài liệu Bộ sưu tập Java. Chúng chia nhỏ mọi thứ thành một tầng trừu tượng (Set, List và Map) và một tầng thực hiện (ArraySet, HashSet, ArrayList, LinkedList, TreeMap, HashMap).

Để được trợ giúp, hãy đọc tài liệu Bộ sưu tập Python. Chúng chia nhỏ mọi thứ thành các lớp cơ sở trừu tượng như Set, Sequence và Map được tạo từ các tính năng mixin của một bộ sưu tập.

+0

posttopic post, anh ta không hỏi về tên của hướng dẫn lập trình. –

+0

Xin lỗi, nhưng tài liệu tham khảo trong các tài liệu tham khảo ngôn ngữ này sẽ trả lời câu hỏi. –

+0

Vâng hầu hết các loại tồn tại để cung cấp đảm bảo phức tạp, và như vậy không phải là cơ bản. Tôi nghi ngờ các hướng dẫn sẽ được thảo luận về các container trong một cách trung lập ngôn ngữ hoặc. –

4

chuỗi, mặc dù họ có thể được thực hiện như mảng dưới mui xe (như một số cấu trúc dữ liệu khác).

Bất kỳ chương trình nào tương tác với người dùng đều sẽ sử dụng chuỗi. Điều quan trọng là phải biết cách thao tác dây.

+0

Các loại dữ liệu biến thể, rất nhiều tàu tuần tra thực hiện được coi là loại dữ liệu cơ bản .... nhưng +1 vì chúng quá quan trọng nên bỏ qua. –

+0

Đủ công bằng. Tôi là một chút trên hàng rào về việc liệu dây có xứng đáng xem xét riêng biệt từ mảng, nhưng nó không thể làm tổn thương, đặc biệt là kể từ khi họ đang rất quan trọng. – jakeboxer

1

một số có thể được coi là ít cơ bản hơn những người khác:

  • toán học vectơ/matricies
  • đồ thị, danh sách kề/matricies
  • cố gắng cây tiền tố/hậu tố
  • không gian lập chỉ mục - cây quad/kd -trees r-trees
  • luồng/chuỗi null chấm dứt chuỗi/lớn ints
+0

Có khá lạ mắt tho:/ –

2

Quadtree s, là loại chỉ mục không gian đơn giản nhất.

+0

thú vị và phức tạp, nhưng imo vì nó áp dụng chặt chẽ với không gian 2-d nó là cơ bản. –

+0

tôi có thể đề xuất R-cây hoặc cây QR không? chúng là một phần mở rộng thú vị của quadtrees. http://en.wikipedia.org/wiki/R-tree – rmeador

+0

ok, để làm rõ, R-tree giống như một phần mở rộng của một cây B, và cây QR là một sự hợp nhất của một quadtree và một R -tree – rmeador

1

Bit array không phải là cơ bản nhưng nó là rất tiện dụng và nó có thể lễ bày hiệu quả sử dụng số nguyên (và các nhà khai thác Bitwise)

+0

+1 sử dụng chúng hàng ngày - rất dễ dàng và nhanh chóng! –

1

Tuples.

Ngoài ra, nếu tôi có thể chỉ định một cấu trúc dữ liệu không cơ bản, nó sẽ là tiền tố bit phân đoạn liên tục Hash Tries từ Clojure.Nói chung, tôi tin rằng sự bền bỉ là một thuộc tính rất quan trọng và thường bị bỏ qua của bất kỳ cấu trúc dữ liệu nào.

3

tôi nghĩ rằng câu hỏi của bạn không rõ ràng, bởi vì bạn đang trộn thực hiện và mục đích ...

sau loại mô tả thực hiện:

  • danh sách liên kết
  • đúp danh sách liên kết
  • skip list
  • mảng
  • dynamic array
  • bảng băm
  • (nhị phân) cây
  • "quản lý" (nhị phân) cây (đống, san bằng cây, vv, tức là cây nơi chèn và xóa không được thực hiện trực tiếp nhưng thông qua một thủ tục mà đảm bảo hạn chế nhất định cho cây)
  • đồ thị (mặc dù rất ưa thích)

sau mô tả mục đích:

  • stack (có nghĩa là Filo & có thể được thực hiện bởi một danh sách liên kết, mà còn với một mảng hoặc vector)
  • hàng đợi (có nghĩa là FIFO & có thể được thực hiện bởi một danh sách liên kết đôi, hoặc có thể theo những cách hợp lý khác)
  • dequeue (...)
  • hàng đợi ưu tiên (có nghĩa là "cao nhất/thấp nhất chính First Out" đây là một khái niệm trừu tượng, mà có thể được thực hiện trong many different ways)
  • bản đồ/kết hợp mảng/từ điển (có nghĩa là bạn các khóa bản đồ cho các giá trị. thường yêu cầu một hàm bổ sung để chuyển đổi khóa thành các khóa hợp lệ cho bảng băm hoặc cây bên dưới)
  • đặt (có nghĩa là đó là một bộ sưu tập có thể lặp lại và có thể biết được liệu giá trị đó có phải là thành phần của tập hợp hay không). giá trị, đó là một phần tử của bộ phải chính xác một lần trong quá trình lặp, một bộ có thể có thể thay đổi hoặc không (có thể cho phép thêm hoặc loại bỏ các phần tử). .) khi nói đến thực hiện, có một số khả năng)

tốt, có muốn được một điều cuối cùng tôi xem xét rất nhiều điều đáng nói: algebraic data types ... tùy thuộc vào ngôn ngữ, họ hoặc là tồn tại tự nhiên, hoặc bạn phải cạnh tranh với họ ... haXe và C# (theo như tôi đã nghe) sẽ là hai ngôn ngữ bắt buộc cung cấp chúng bằng cách cho phép các thông số cho enums ... chúng có thể được sử dụng để thực hiện danh sách, cây và nhiều thứ đẹp khác ... ví dụ, chúng hoàn hảo để đại diện cho AST và rất nhiều cấu trúc phức tạp khác ...

+0

Tôi hiểu những gì bạn đang nói, nhưng chúng vẫn là cấu trúc dữ liệu riêng biệt; bạn có thể thành thạo trong các danh sách liên kết, mảng và các cách khác để triển khai ngăn xếp mà không cần phải tự hiểu các ngăn xếp và bạn có thể hiểu rõ về các ngăn xếp mà không hiểu sự triển khai của chúng. Tôi đang cố gắng liệt kê các cấu trúc dữ liệu cơ bản, cho dù chúng là triển khai hay giao diện. – jakeboxer

0

Không thể triển khai "đối tượng chức năng", "con trỏ hàm" hoặc "đóng cửa" ở một số ngôn ngữ hạn chế có mảng, danh sách được liên kết, vv Nhưng có lẽ chúng gần với các kiểu dữ liệu hơn là cấu trúc dữ liệu.

"rope" implementation (như được triển khai trong thư viện "dây") là triển khai yêu thích của tôi về cấu trúc dữ liệu trừu tượng "chuỗi", nhưng có lẽ nó không thực sự "cơ bản".

Các vấn đề liên quan