数据结构及算法介绍

数据结构及算法介绍


一、数组与字符串

定义

  • 数组:一种线性数据结构,用于存储一组相同类型的元素。
  • 字符串:字符的有序集合,本质上是一个字符数组。

特点

  • 数组
    • 元素在内存中连续存储。
    • 支持随机访问(通过索引)。
    • 插入和删除操作效率较低(需要移动元素)。
  • 字符串
    • 不可变性(如 Java 中的 String 是不可变对象)。
    • 支持拼接、分割、匹配等操作。

应用场景

  • 数组:存储固定大小的数据集合(如成绩列表)。
  • 字符串:文本处理(如搜索、替换、模式匹配)。

代码示例

// 数组
int[] array = new int[5];
array[0] = 1;
System.out.println(array[0]); // 输出:1

// 字符串
String str = "Hello, World!";
System.out.println(str.length()); // 输出:13

二、链表

定义

  • 一种动态数据结构,由节点组成,每个节点包含数据和指向下一个节点的引用。

特点

  • 单向链表:每个节点只有一个指针,指向下一个节点。
  • 双向链表:每个节点有两个指针,分别指向前一个和后一个节点。
  • 动态扩展,插入和删除效率高,但访问效率低(无法随机访问)。

应用场景

  • 实现栈、队列。
  • 数据频繁插入和删除的场景。

代码示例

class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class LinkedList {
    Node head;

    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

三、栈与队列

定义

  • :后进先出(LIFO)的数据结构。
  • 队列:先进先出(FIFO)的数据结构。

特点

    • 常用于递归、表达式求值、括号匹配等场景。
  • 队列
    • 常用于任务调度、广度优先搜索(BFS)等场景。

应用场景

  • 栈:函数调用栈、撤销操作。
  • 队列:打印任务队列、消息队列。

代码示例

// 栈
import java.util.Stack;

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 输出:2

// 队列
import java.util.LinkedList;
import java.util.Queue;

Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
System.out.println(queue.poll()); // 输出:1

四、哈希表

定义

  • 一种基于键值对存储数据的结构,通过哈希函数将键映射到存储位置。

特点

  • 查找、插入、删除操作的时间复杂度为 O(1)(理想情况下)。
  • 存在哈希冲突问题,需通过链地址法或开放地址法解决。

应用场景

  • 快速查找(如字典、缓存)。
  • 统计频率(如统计单词出现次数)。

代码示例

import java.util.HashMap;

HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
System.out.println(map.get("Alice")); // 输出:25

五、树

定义

  • 一种非线性数据结构,由节点组成,每个节点包含数据和指向子节点的引用。

特点

  • 二叉树:每个节点最多有两个子节点。
  • 二叉搜索树(BST):左子树的所有节点值小于根节点,右子树的所有节点值大于根节点。
  • 平衡树:如 AVL 树、红黑树,保持树的高度平衡以优化性能。

应用场景

  • 文件系统。
  • 搜索和排序(如二叉搜索树)。

代码示例

class TreeNode {
    int val;
    TreeNode left, right;

    public TreeNode(int val) {
        this.val = val;
        this.left = this.right = null;
    }
}

class BinaryTree {
    TreeNode root;

    public void inOrder(TreeNode node) {
        if (node != null) {
            inOrder(node.left);
            System.out.print(node.val + " ");
            inOrder(node.right);
        }
    }
}

六、堆

定义

  • 一种特殊的完全二叉树,分为最大堆和最小堆。

特点

  • 最大堆:父节点的值大于等于子节点的值。
  • 最小堆:父节点的值小于等于子节点的值。
  • 常用于优先队列、堆排序。

应用场景

  • 任务调度(优先级高的任务先执行)。
  • 堆排序。

代码示例

import java.util.PriorityQueue;

PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
maxHeap.add(10);
maxHeap.add(20);
maxHeap.add(5);
System.out.println(maxHeap.poll()); // 输出:20

七、图

定义

  • 由顶点和边组成的非线性数据结构,用于表示对象之间的关系。

特点

  • 无向图:边没有方向。
  • 有向图:边有方向。
  • 加权图:边有权重。

应用场景

  • 社交网络。
  • 地图导航(最短路径问题)。

代码示例

import java.util.*;

class Graph {
    private Map<Integer, List<Integer>> adjList;

    public Graph() {
        adjList = new HashMap<>();
    }

    public void addEdge(int u, int v) {
        adjList.computeIfAbsent(u, k -> new ArrayList<>()).add(v);
        adjList.computeIfAbsent(v, k -> new ArrayList<>()).add(u);
    }

    public void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();
        Set<Integer> visited = new HashSet<>();
        queue.add(start);
        visited.add(start);

        while (!queue.isEmpty()) {
            int node = queue.poll();
            System.out.print(node + " ");

            for (int neighbor : adjList.getOrDefault(node, new ArrayList<>())) {
                if (!visited.contains(neighbor)) {
                    visited.add(neighbor);
                    queue.add(neighbor);
                }
            }
        }
    }
}

总结

以上是常见数据结构及算法的介绍,涵盖了数组与字符串、链表、栈与队列、哈希表、树、堆和图的核心概念及代码实现。通过学习这些内容,你将能够掌握数据结构与算法的基础知识,并能够灵活运用它们解决实际问题!

你可能感兴趣的:(#,数据结构及算法,数据结构,算法)