数据结构:构建程序的基石
(一)数组与链表
数组是一种线性数据结构,它在内存中是连续存储的,这使得我们可以通过下标快速访问元素。而链表则是由一系列节点组成,每个节点包含数据和指向下一个节点的引用,节点在内存中并不一定连续,这使得链表在插入和删除操作上比数组更具优势。
(二)基于数组的扩展结构
矩阵:可以看作是二维数组,常用于处理图形、数学计算等领域。
栈:遵循后进先出(LIFO)原则,既可以基于数组实现,也可以基于链表实现。在 Java 中,java.util.Stack类提供了栈的基本操作。
队列:遵循先进先出(FIFO)原则,同样可以基于数组或链表实现。java.util.Queue接口及其实现类如PriorityQueue、LinkedList(实现了Queue接口)提供了队列的操作方法。
(三)基于链表的扩展结构
栈:基于链表实现的栈,在插入和删除操作时无需考虑数组那样的扩容问题,操作更加灵活。
队列:链表实现的队列在处理大量数据时,避免了数组可能出现的频繁扩容开销。
树:树是一种非线性数据结构,每个节点可以有多个子节点,常用于存储具有层级关系的数据,如文件目录结构、组织架构等。常见的树结构有二叉树、二叉搜索树、AVL 树、红黑树等。
图:图是一种更为复杂的数据结构,用于表示对象之间的关系,由节点和边组成。在社交网络分析、路径规划等领域有着广泛应用。
(四)基于数组和链表扩展的哈希表
哈希表通过哈希函数将键映射到数组的索引位置,从而实现快速的查找、插入和删除操作。它结合了数组的快速访问特性和链表的灵活插入删除特性,在解决哈希冲突时,常用的方法有链地址法(将冲突的元素存储在链表中)和开放地址法。
算法实践
(一)线性结构算法
数组和链表的遍历:遍历是访问数据结构中每个元素的基本操作。对于数组,我们可以使用普通的for循环进行遍历;对于链表,则需要通过节点的引用依次访问每个节点。
子集的查找与求解:在数组或链表中查找特定的子集,需要根据具体的问题需求设计合适的算法,如暴力搜索、二分查找(针对有序数组)等。
(二)数据结构的操作算法
增:增加单个数据时,需要考虑插入位置是头、中还是尾。增加多个数据时,涉及数组与数组的合并、数组与链表的合并,同时要注意合并时的顺序问题。对于数组,增加元素时还需考虑扩容机制,以避免数组越界。
删:删除操作包括删除单个元素(根据位置或元素内容)、删除多个元素(按照下标区间或元素集合)。删除后,需要处理空位置的覆盖问题,以保持数据结构的完整性。
查:查找操作可以根据位置或元素内容进行。此外,还包括查找子集和查找重复项等操作,不同的查找需求需要不同的算法策略。
改:修改操作包括单个替换(根据位置或元素)和批量替换,需要确保修改操作不会破坏数据结构的逻辑。
(三)算法层次
数据结构的基本操作:熟练掌握各种数据结构的增、删、查、改操作,是编写高效算法的基础。
工具算法:学习和掌握一些常用的工具算法,如哈希算法、KMP 算法等,这些算法在解决特定问题时非常有效。
算法思路:深入理解排序、查找、分治、回溯、贪心、动态规划等算法思路,能够根据不同的问题选择合适的算法策略。
工程应用:将数据结构与算法应用到实际的工程中,如数据库(MySQL、Redis)的设计与优化,提高系统的性能和稳定性。
代码实现示例
以下是一个简单的链表实现示例,包括节点类和链表类,链表类实现了尾插法添加元素的功能:
// 节点类 用于在内存中创建节点对象空间 class Node { String value; Node nextNodeAddress; } // 链表类 用于管理内存中分散的各个节点 串联起来 class ALinkList { Node root; public void add(String value) { // 将元素值存到一个新的节点中,然后将节点挂在最后一个节点的下一个 Node node = new Node(); node.value = value; if (root == null) { root = node; return; } // 为了不修改root的值 创建一个临时的Node变量存储头节点的位置 Node temp = root; while (temp.nextNodeAddress!= null) { temp = temp.nextNodeAddress; } temp.nextNodeAddress = node; } // 头插法 // 尾插法 // Test public static void main(String[] args) { ALinkList link = new ALinkList(); for (int i = 0; i < 1000; i++) { link.add("hello" + i); } link.add("world"); System.out.println("end"); } }数据类型与符号表
(一)数据类型
Java 中有 8 种基本数据类型,包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boolean)。此外,还有引用数据类型,如String以及所有的类和接口,它们存储的是对象的引用地址。
(二)符号表
在 Java 中,每个对象变量都有对应的符号表记录其类型、名称、长度和地址等信息。例如,创建一个Node对象时,符号表会记录其类型为Node,名称为变量名,长度为地址编码的长度,以及对象在内存中的地址。