编程中的 6 种常见数据结构

数据结构是编程中高效软件的基石。了解何时以及为何使用每个数据结构可以提高您的问题解决能力。在这里,我们探索 6 种基本数据结构,深入研究它们的特征、用例和 TypeScript 中的实现。每个部分都包含图表和代码示例,以便清晰理解。

1. 数组

数组是一块连续的内存块,其中存储相同类型的元素。

**特征:**

  • 通过索引快速访问。
  • 固定大小(在大多数语言中)。
  • 可以保存重复的值。
  • **何时使用:**数组用于存储需要快速随机访问的元素的有序集合。

    **代码示例**

    const fruits: string[] = ['apple', 'banana', 'cherry'];
    console.log(fruits[1]); // Outputs: banana

    **可视化**

    2. 链表

    链表是节点的集合,其中每个节点包含数据和对下一个节点的引用。

    **特征:**

  • 动态尺寸。
  • 随机存取效率低下。
  • 高效的插入/删除。
  • **何时使用:**对于需要频繁插入和删除的应用程序使用链接列表,例如编辑器中的撤消功能。

    **代码示例**

    class Node {
      value: T;
      next: Node | null = null;
      constructor(value: T) {
        this.value = value;
      }
    }
    
    class LinkedList {
      head: Node | null = null;
    
      add(value: T) {
        const newNode = new Node(value);
        if (!this.head) {
          this.head = newNode;
        } else {
          let current = this.head;
          while (current.next) {
            current = current.next;
          }
          current.next = newNode;
        }
      }
    }
    
    const list = new LinkedList();
    list.add(10);
    list.add(20);
    console.log(JSON.stringify(list)); 
    // Outputs: {"head":{"value":10,"next":{"value":20,"next":null}}}

    **可视化**

    3. 堆叠

    堆栈是一种 LIFO(后进先出)数据结构。

    **特征:**

  • 推送和弹出操作。
  • 对于回溯很有用,例如在 DFS 或表达式评估中。
  • **何时使用:**使用堆栈来管理函数调用、语法解析或撤消操作。

    **代码示例**

    class Stack {
      private items: T[] = [];
      push(item: T): void {
        this.items.push(item);
      }
      pop(): T | undefined {
        return this.items.pop();
      }
      display(): void {
        console.log(this.items.reverse());
      }
    }
    
    const stack = new Stack();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    console.log(stack.pop()); // Returns 3

    **可视化**

    4. 队列

    队列是一种 FIFO(先进先出)数据结构。

    **特征:**

  • 入队和出队操作。
  • 用于调度和缓冲。
  • **何时使用:**使用队列来管理任务,例如作业调度或广度优先搜索。

    **代码示例**

    class Queue {
      private items: T[] = [];
      enqueue(item: T): void {
        this.items.push(item);
      }
      dequeue(): T | undefined {
        return this.items.shift();
      }
      display(): void {
        console.log(this.items);
      }
    }
    
    const queue = new Queue();
    queue.enqueue(1);
    queue.enqueue(2);
    queue.enqueue(3);
    queue.display(); // Outputs: [1, 2, 3]
    console.log(queue.dequeue()); // Returns 1

    **可视化**

    5.哈希表

    哈希表是一种针对快速查找进行优化的键值对数据结构。

    **特征:**

  • 查找和插入的平均时间复杂度为 O(1)。
  • 使用链接或开放寻址处理冲突。
  • **何时使用:**使用哈希表作为字典、缓存和集合。

    **代码示例**

    class HashTable {
      private buckets: [K, V][][] = [];
    
      private hash(key: K): number {
        return JSON.stringify(key).length % 10;
      }
    
      set(key: K, value: V): void {
        const index = this.hash(key);
        this.buckets[index] = this.buckets[index] || [];
        this.buckets[index].push([key, value]);
      }
    
      get(key: K): V | undefined {
        const index = this.hash(key);
        const bucket = this.buckets[index] || [];
        for (const [k, v] of bucket) {
          if (k === key) return v;
        }
      }
    }
    
    const hashTable = new HashTable();
    hashTable.set("name", "Alice");
    hashTable.set("age", 30);
    console.log(hashTable.get("age")); // Outputs: 30

    **可视化**

    6.二叉树

    二叉树是一种层次结构,其中每个节点最多有两个子节点。

    **特征:**

  • 遍历包括中序、前序和后序。
  • 二叉搜索树(BST)的基础。
  • **何时使用:**使用二叉树来存储文件系统等分层数据。

    **代码示例**

    class TreeNode {
      value: T;
      left: TreeNode | null = null;
      right: TreeNode | null = null;
    
      constructor(value: T) {
        this.value = value;
      }
    }
    
    const root = new TreeNode(1);
    root.left = new TreeNode(2);
    root.right = new TreeNode(3);
    console.log(JSON.stringify(root));
    // Outputs: {"value":1,"left":{"value":2,"left":null,"right":null},"right":{"value":3,"left":null,"right":null}}

    **可视化**

    结论

    理解数据结构对于编写高效且可扩展的代码至关重要。数组、链表、堆栈、队列、哈希表和二叉树各有其特定用途,从管理顺序到分层组织数据。

    掌握这些基础知识可以让你解决各种挑战,无论是在编程面试还是实际项目中。经常练习,你很快就会看到它对你解决问题能力的影响。

    进一步学习参考资料

    **图书:**

  • Cormen、Leiserson、Rivest 和 Stein 的《算法导论》。
  • Mark A. Weiss 著的《Java 中的数据结构和算法分析》。
  • Steven Skiena 著的《算法设计手册》。
  • **互动平台:**

  • LeetCode-使用这些结构解决编码问题。
  • GeeksforGeeks——关于数据结构的综合文章。
  • HackerRank - 学习并实践数据结构。
  • **课程:**

  • CS50 计算机科学简介 - 非常适合初学者的资源。
  • Coursera 上的数据结构和算法专业化——深入、结构化的学习。
  • 在 X 上关注我以了解更多!