数据结构与算法
导学
- 基础数据结构
数据结构是计算机存储、组织和管理数据的方式。学习数据结构的基础是掌握常见的数据结构,如数组、链表、栈、队列、树、图等。建议先掌握线性结构,再学习树、图等非线性结构。- 基础算法
算法是指解决问题的方法和步骤。在学习数据结构的同时,需要掌握基础算法,如排序、查找、递归、分治、贪心、动态规划等。建议先掌握基础排序算法,如冒泡排序、选择排序、插入排序,再学习高级排序算法,如快速排序、归并排序。- 算法思想
算法思想是指解决问题的一般思路和方法。常见的算法思想有分治、贪心、动态规划等。在学习算法时,需要掌握不同算法思想的特点和适用场景。- 高级数据结构
在掌握基础数据结构和算法后,可以学习一些高级数据结构,如红黑树、堆、哈希表、并查集等。这些数据结构在实际问题中有着广泛的应用,例如数据库、操作系统等。- 算法优化
在实际应用中,需要考虑算法的效率和性能。可以学习一些算法优化的方法,如剪枝、记忆化搜索、并行算法等,以提高算法的效率和性能。- 实战练习
最后,需要通过实战练习来巩固所学的知识。可以参加一些算法竞赛或者刷一些算法题目,如LeetCode、LintCode等,以提高自己的算法水平。
基础数据结构
线性结构
线性结构是一种数据元素之间存在一对一关系的结构,包括数组、链表、队列、栈等。
数组
数组是一种线性数据结构,由相同类型的元素组成的有限序列。它在计算机科学中被广泛应用,也是最常见、最基本的数据结构之一。
数组中的每个元素在内存中都是连续存放的,而且每个元素都有一个唯一的下标(或索引),从 0 开始递增。这使得我们可以根据数组的下标快速访问数组中的任意元素。
数组可以存储任何类型的元素,包括整数、浮点数、字符以及自定义对象等。创建数组时需要指定元素类型和数组大小。数组的大小在创建时就已经确定,并且无法随意改变,因此称为静态数组。
另外,还有一种动态数组(Dynamic Array),其大小可以动态增加或缩小,被称为 ArrayList(Java)或 vector(C++)等。动态数组通常是基于静态数组实现的,通过重新分配内存并复制旧数据来实现大小的扩展或缩小。
数组方法
Java 中数组是内置的数据结构,可以使用一些数组的内置方法来操作它们。以下是 Java 中数组的所有方法:
-
创建数组:使用下面语句创建一个指定大小的数组
data_type[] array_name = new data_type[array_size];
-
初始化数组:可以使用以下语句(其中 n 为数组大小)将所有元素设置为默认值
int[] arr = new int[n]; // 默认值为0 boolean[] arr2 = new boolean[n]; // 默认值为false
或者直接在创建数组时设置初始值,如下所示:
int[] arr = {1, 2, 3, 4}; String[] strArr = {"hello", "world"};
-
访问数组元素:使用下标操作符 [] 来访问数组元素,下标从 0 开始。
int[] arr = {1, 2, 3, 4, 5}; System.out.println(arr[0]); // 输出 1 System.out.println(arr[3]); // 输出 4
-
修改数组元素:使用下标操作符 [] 来修改数组元素的值。
int[] arr = {1, 2, 3, 4, 5}; arr[0] = 10; System.out.println(arr[0]); // 输出 10
-
遍历数组:使用循环结构遍历数组中的所有元素。
int[] arr = {1, 2, 3, 4, 5}; for (int i = 0; i < arr.length; i++) { // 普通for循环 System.out.println(arr[i]); } for (int i : arr){ // 增强for循环 System.out.println(i); } System.out.println(Arrays.toString(arr))//将数组转换为字符串输出
-
求数组长度:使用 length 属性可以获取数组的长度。
int[] arr = {1, 2, 3, 4, 5}; System.out.println(arr.length); // 输出 5
-
数组复制:Java 提供了一个
System.arraycopy()
方法,可以将一个数组的指定元素复制到另一个数组中。int[] src = {1, 2, 3, 4, 5}; int[] dest = new int[3]; /** *public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) *src:源数组。 *srcPos:源数组中要复制的起始位置(下标)。 *dest:目标数组。 *destPos:目标数组中复制的起始位置(下标)。 *length:要复制的元素个数。 */ System.arraycopy(src, 0, dest, 0, 3); // 复制前三个元素到目标数组 // 输出目标数组中的元素 for (int i = 0; i < dest.length; i++) { System.out.println(dest[i]); // 输出 1、2、3 }
-
数组排序:Java 中提供了多种排序算法,最常用的是
Arrays.sort()
方法。Arrays.sort(int[] a, int fromIndex, int toIndex)
方法可以对整型数组 a 的从 fromIndex 到 toIndex 之间的元素进行排序;Arrays.parallelSort(int[] a)
方法则使用并行快速排序算法对整型数组 a 进行升序排序,可在多核 CPU 上加速排序过程。int[] arr = {3, 2, 1, 5, 4}; Arrays.sort(arr); // 对数组进行升序排列 // 输出排序后的数组元素 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); // 输出 1、2、3、4、5 }
-
数组查找:Java 中提供了多种方法来查找数组中的元素,包括线性查找和二分查找等。
int[] arr = {3, 2, 1, 5, 4}; int index = Arrays.binarySearch(arr, 1); // 使用二分查找算法查找元素 1 注意:使用 binarySearch() 方法时,必须确保数组已经排好序 System.out.println(index); // 输出 2,表示元素 1 在数组中的索引为 2
实战练习题 LeetCode二分查找