
数据结构与算法
文章平均质量分 82
数据结构与算法是非常重要的,这个专栏我会以Java语言为示例进行更新
Bro_cat
27届毕业,目前在校生,目标是java后端开发,希望大家可以互相交流
展开
-
Trie --字典树/前缀树
Trie(读音为“try”)是一种树形数据结构,主要用于存储字符串集合,以便能够快速地检索字符串。Trie的每个节点代表一个字符,通过从根节点沿着边走向下一个节点,可以形成存储的字符串。Trie的特殊之处在于,它通过共享前缀来节省存储空间,以提高检索速度。Trie不仅可以用于单纯的字符串存储,还可以用于前缀匹配、自动补全、拼写检查等应用场景。它是一种高效的多路搜索树,特别适合用于处理大量字符串的情况。原创 2024-11-02 18:01:31 · 437 阅读 · 0 评论 -
离散化 ---( 求区间和)
离散化是将连续的数值范围映射到有限的、离散的数值集合的过程。在许多情况下,数据可能会存在多个重复值或范围较大的连续值。为了简化处理,尤其是处理区间查询和增量问题时,我们可以将这些值转换为一组有限的、唯一的值(即离散值),从而更高效地进行操作。例如,如果我们有一组数值 {1.1, 1.2, 1.15, 2.5},在离散化后,我们可能会将其映射为 {1, 2, 3} 这样的索引值,便于后续的操作。用离散化的方式有效处理增量操作和区间查询问题。原创 2024-09-26 19:02:14 · 871 阅读 · 0 评论 -
位运算--(二进制中1的个数)
x & -x位运算性能优越,适用于多种场景。通过介绍这两种基本位操作,我们可以更加深入地理解和运用位运算,从而提升编程效率。希望能对你有所帮助……原创 2024-09-25 21:32:29 · 509 阅读 · 0 评论 -
双指针算法详解
双指针算法是一种常用的算法策略,通常用于处理有序数组或链表,能够高效地解决许多问题。其核心思想是通过维护两个指针在数组或链表中移动,从而达到减少时间复杂度的目的。我们将通过三个示例代码来深入了解双指针算法的应用。双指针算法是处理数组和链表问题中非常高效的一种策略。通过上述示例,我们可以看到双指针的灵活运用可以有效解决问题,尤其是在减少时间复杂度方面优势明显。在开发过程中,熟悉双指针的应用场景将对我们解决实际问题有很大帮助。希望这些示例和逻辑解释能够帮助你更好地理解双指针算法。原创 2024-09-25 21:17:08 · 874 阅读 · 0 评论 -
栈(Stack):基于链表和数组
E pop();E peek();栈可以通过链表或数组两种方式实现,各有其优缺点。在选择具体实现时,应根据应用场景、内存限制及性能需求来决定使用哪种方式。对于需要动态调整大小且频繁进行插入和删除操作的场合,可以选择链表实现;而对于固定大小且对性能要求较高的场合,则可选择数组实现。原创 2024-09-18 18:01:19 · 497 阅读 · 0 评论 -
二叉树的层序遍历
二叉树是一种常见的数据结构,由节点组成。每个节点最多可以有两个子节点,分别称为左儿子和右儿子。二叉树广泛应用于各种算法和数据结构中,例如表达式树、搜索树等。原创 2024-09-18 16:43:06 · 401 阅读 · 0 评论 -
前缀和与差分
了解前缀和与差分,不仅能有效提高区间和查询的效率,还能快速处理区间更新。掌握这些算法,可以帮助我们解决许多实际编程挑战,使我们在面对大数据时更加得心应手。原创 2024-09-17 15:03:41 · 516 阅读 · 0 评论 -
环形数组与单向链表的队列实现(Queue)
队列是一种重要的线性数据结构,具有先进先出(FIFO)的特性。元素的插入操作称为入队,删除操作称为出队。队列在许多计算机科学应用中非常常见,如任务调度和数据缓冲等。在实现队列时,可以使用数组或链表。尽管数组实现可以简单直观,但在某些情况下,尤其是出队操作频繁时,使用链表会更加优越。因为链表在出队时不需要移动后面的数据,相比之下,数组实现可能会在数组头部出队时造成效率低下,更需要手动位移元素。/***队列接口*///添加元素到队尾E poll();//删除队首元素,并返回该元素E peek();原创 2024-09-17 11:52:26 · 1099 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序(Merge Sort)是一种经典的排序算法,它采用分治法(Divide and Conquer)策略,将一个大数组分为两个小数组,分别进行排序,然后将这两个已排序的小数组合并成一个有序的大数组。归并排序在最坏情况下的时间复杂度为 O(nlogn)O(nlogn),并且是一种稳定的排序算法。归并排序是一种高效且稳定的排序算法,适用于大规模数据的排序。通过分治法的思想,归并排序能够在最坏情况下保持 O(nlogn)O(nlogn) 的时间复杂度。原创 2024-09-15 10:42:58 · 1185 阅读 · 0 评论 -
快速排序(分治思想)
快速排序(Quick Sort)是一种广泛使用的高效排序算法,由计算机科学家托尼·霍尔在1960年提出。它采用分治法(Divide and Conquer)策略,将一个大数组分为两个小数组,然后递归地对这两个小数组进行排序。快速排序在平均情况下具有良好的性能,时间复为 O(nlogn)O(nlogn),并且在实际应用中通常比其他 O(nlogn)O(nlogn) 的排序算法(如归并排序和堆排序)更快。在快速排序的实现中,我们使用两个指针i和j来进行分区操作。i。原创 2024-09-13 18:23:52 · 1555 阅读 · 0 评论 -
Scala&尾递归解决爆栈问题
Scala的尾递归优化原创 2024-09-12 20:00:55 · 1535 阅读 · 4 评论 -
最全面的递归算法详解,一篇足矣(高手必备)
递归是一种强大的编程技术,允许函数在其定义中调用自身。基本情况:这是递归的终止条件,当满足此条件时,函数将不再调用自身。递归情况:这是函数调用自身的部分,通常会将问题规模缩小。多路递归是指一个函数在递归调用时,同时调用多个子问题。在斐波那契数列的例子中,同时调用了和,这种并行调用的方式就是多路递归。多路递归可能会导致重复计算和较高的空间复杂度,但可以通过记忆化或动态规划来优化。原创 2024-09-11 17:43:19 · 2833 阅读 · 0 评论 -
Java-实现双向环形链表
双向环形链表不仅支持双向遍历,还形成一个闭合环,即最后一个节点的next指针指向链表的头部,第一个节点的prev指针指向链表的尾部。使用这种结构可以实现更加灵活的循环遍历操作。双向环形链表是编程中一种强大且灵活的数据结构,它可用于在循环访问中保持高效。通过合理设计Node结构和使用哨兵节点,我们简化了边界条件的处理,提供了更直观的操作方法。希望对你有所帮助。原创 2024-09-10 11:52:23 · 697 阅读 · 0 评论 -
Java-双向链表的实现
双向链表是一种灵活且高效的数据结构,它通过每个节点中的前后指针,使得在链表中的任意位置进行插入和删除操作变得简单。希望对你有所帮助。原创 2024-09-10 10:22:48 · 598 阅读 · 0 评论 -
Java-单向链表实现
链表是一种常见的数据结构,用于存储一系列元素。与数组不同,链表中的元素(节点)在内存中不必是连续的。每个节点包含数据部分和指向下一个节点的引用(指针)。链表的主要优点是插入和删除操作的时间复杂度为O(1),但访问特定元素的时间复杂度为O(n)。哨兵节点(也称为哑节点或伪节点)是一个特殊的节点,通常不包含实际数据,仅用于简化链表的操作。在单向链表中,哨兵节点通常作为头节点使用,使得链表的插入、删除等操作更加统一和简单。原创 2024-09-06 19:56:12 · 880 阅读 · 0 评论 -
Java——动态数组实现的原理与应用
动态数组通过在运行时调整大小,提供了比传统数组更大的灵活性。通过合理使用Java的API,如和IntStream,可以高效地实现动态数组的各种操作。希望这篇博客能帮助你更好地理解动态数组的实现原理及其应用。原创 2024-09-06 10:00:00 · 422 阅读 · 0 评论 -
如何衡量一个算法的好坏
在选择算法时,除了考虑时间复杂度外,还需关注空间复杂度。某些情况下,时间复杂度和空间复杂度可能存在权衡。例如,某些算法可能通过使用更多的内存来提高运行速度。理解这两者的关系,有助于在实际应用中做出更优的选择。通过以上示例,我们可以看到,时间复杂度和空间复杂度是评价算法好坏的重要标准。在实际开发中,选择合适的算法不仅能提高程序的运行效率,还能优化资源的使用。原创 2024-09-05 14:45:49 · 707 阅读 · 0 评论 -
二分查找 ,看这一篇就够了
二分查找(Binary Search)是一种高效的查找算法,适用于在有序数组中查找特定元素。其基本思想是通过逐步缩小查找范围,每次将查找区间减半,从而大大提高查找效率。二分查找的时间复杂度为O(log n),远优于线性查找的O(n)。使用二分查找的前提条件是,数组是有序的。因为i和j是指针,指向数组的第一个元素和最后一个元素,如果要查找的元素刚好是第一个或者最后一个元素 ,当i和j重合时,说明数组中没有目标值,返回-1,这样会导致结果不符,所以要采用原创 2024-09-05 14:20:24 · 1441 阅读 · 0 评论