
数据结构和算法(C#)
文章平均质量分 74
数据结构和算法(C#)
JTWEI
这个作者很懒,什么都没留下…
展开
-
数据结构和算法(1):基本概念
简单的理解就是关系。在我们的工作当中,我们所需要的如栈、队列、链表、以及查找、排序等算法,在编程语言的开发工具包中都有完美的实现,我们只需要掌握如何使用它们就可以了,为什么还要去弄懂这些算法原理呢?你将学习不同算法的设计思想、常见的算法模式和技巧,以及解决特定问题的有效算法。在数据结构和算法领域,还有许多具体的概念和技术需要学习,如哈希表、堆、红黑树、贪心算法、回溯算法等。2.2.链式存储结构:是把数据元素存放在任意的存储单元里,通过指针记录数据元素的地址,这组存储单元可以是连续的,也可以是不连续的。原创 2023-08-09 14:59:14 · 84 阅读 · 0 评论 -
数据结构和算法(2):时间复杂度和空间复杂度
正确性:是指算法至少应该具有输入、输出、和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。可读性:算法设计的另一目的是为了便于阅读、理解和交流。健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。时间效率高和存储量低(时间复杂度和空间复杂度)原创 2023-08-09 14:59:51 · 124 阅读 · 0 评论 -
数据结构和算法(3):线性表的基本特性
线性表(List):零个或多个数据元素的有限序列。首先它是一个序列。元素之间是有顺序的。若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。数据元素之间的关系是一对一的关系。其次,线性表强调是有限的。线性表元素的个数n(n≥0)定义为线性表的长度,当n=0时,成为空表。原创 2023-08-09 15:00:40 · 124 阅读 · 0 评论 -
数据结构和算法(4):C#中的顺序存储——数组、List
顺序存储结构是一种数据的物理存储方式,它将数据元素按照其逻辑顺序依次存储在一片连续的存储空间中。常见的顺序存储结构有数组和线性表。原创 2023-08-09 15:01:28 · 2118 阅读 · 0 评论 -
数据结构和算法(5):链式存储结构——链表、LinkedList
链表是一种常见的数据结构,用于存储和组织数据。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表中的每个节点都是独立分配的,它们在内存中可以不连续地存储。链表的主要特点是灵活性。相比于数组,链表的长度可以动态地增加或减少,不需要预先分配固定大小的内存空间。这使得链表在需要频繁插入和删除元素的场景中表现优秀。一个单向链表节点基本上是由两个元素,即数据字段和指针所组成,而指针将会指向下一个元素在内存中的地址。在“单向链表”中第一个节点是“链表头指针”。原创 2023-08-09 15:04:52 · 474 阅读 · 0 评论 -
数据结构和算法(6):堆栈及C#Stack源码分析
Stack使用一个内部数组(_array)来存储栈中的元素。栈的大小(_size)表示当前栈中元素的数量。当向栈中添加元素(Push操作)时,首先检查栈的大小是否等于内部数组的长度。如果相等,说明数组已满,需要扩展数组以容纳更多元素。新数组的长度是当前数组长度的2倍,如果当前数组长度为0,则使用默认容量(_defaultCapacity)。由于内部数组的扩展策略是翻倍,可能会导致内存占用较高。在某些情况下,数组的实际使用大小可能远小于其分配的大小。原创 2023-08-09 15:06:42 · 240 阅读 · 0 评论 -
数据结构和算法(7):队列及C#Queue源码分析
入队和出队操作的时间复杂度可能为 O(n):数组实现的队列在进行入队和出队操作时可能需要移动元素,这可能导致 O(n) 的时间复杂度。然后把数据存到游标的位置,并且通过取余的方法,计算下一次添加数据时,末尾游标应该在的位置。随机访问效率较低:链表实现的队列不支持随机访问,如果需要访问特定位置的元素,需要从头开始遍历链表,时间复杂度为 O(n)。内存连续:数组实现的队列中的元素在内存中是连续的,这有助于提高缓存命中率,从而提高程序的性能。当扩容的时候,会使用到创建的数据,把原来的数据Copy到新的数组。原创 2023-08-09 15:07:47 · 414 阅读 · 0 评论 -
数据结构和算法(8):树
如果没有孩子的节点,这个长子域就设置为-1.再添加一个右兄弟的指针域,这样不管有多少孩子,我们都可以通过不断查找有兄弟的方法,找到左右的孩子。这样的存储结构,我们可以 根据节点的parent指针很容易找到它的双亲,时间复杂度为O(1),直到parent为-1时,表示找到了树的根节点。层数(Level):树的层数,假设树根A为第一层,那么B、C、D节点的层数为2,E、F、G、H、I、J的层数为3。父节点(Parent):每一个节点有连接的上一层节点即为父节点,如图1,F的父节点为B,而B的父节点为A。原创 2023-08-09 15:09:07 · 109 阅读 · 0 评论 -
数据结构和算法(9):二叉排序树
从上面的规则我们知道,左子树内的值一定小于树根,而左子树的值一定大于树根。因此,只需要利用“中序遍历”方式就可以得到从小到大排序好的数据。二叉树是一种很好的排序应用模式,因为在建立二叉树的同时,数据已经经过初步的比较,并按照二叉树的建立规则来存放数据。数据以递归的方式与树根进行比较,小于树根置于左子树,大于树根置于右子树。首先创建一个节点类,这个节点包含数据Data,左孩子Left的引用,右孩子Right的引用。之后的数据以递归的方式与树根进行比较,小于树根置于左子树,大于树根置于右子树。原创 2023-08-09 15:09:49 · 85 阅读 · 0 评论 -
数据结构和算法(10):线索二叉树
另一个方面,我们在做遍历时,比如下图做中序遍历是,得到了HDIBJEAFCG这样的字符序列,遍历过后,我们可以知道,节点I的前驱是D,后继是B。在二叉链表上,我们只能知道每个节点指向其左右孩子节点的地址,而不知道某个节点的前驱是谁,后继是谁。对于一个有n个节点的二叉链表,每个节点有指向左右孩子的两个指针域,所以一共是2n个指针域。H的后继D,D的后继是I,I的后继是B,......,C的后继是G。假如,我们将所有的空指针域中的右孩子,改为指向他的后继节点,这样是否可以满足呢?,此时共有6个空指针域被利用。原创 2023-08-09 15:11:00 · 114 阅读 · 0 评论 -
数据结构和算法(11):排序概述
在排序的过程中,数据移动方式可分为“直接移动”和“逻辑移动”两种。“直接移动”是直接交换存储数据的位置,而”“逻辑移动”并不会移动数据存储的位置,仅改变指向这些数据的辅助指针的值。原创 2023-08-10 19:51:46 · 91 阅读 · 0 评论 -
数据结构和算法(12):冒泡排序
冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡从水底逐渐升到水面上一样。如此扫描过一次之后就可以确保最后一个元素是位于正确的顺序,接着逐步进行第二次扫描,直到完成所有元素的排序关系为止。不管数据是否已排序完成都会固定执行n(n-1)/2次。为了避免这种情况,可以使用“岗哨”概念既可以提前终端程序,又可以得到正确的排序结果,依次来提高程序执行的效率。原创 2023-08-10 19:53:38 · 73 阅读 · 0 评论 -
数据结构和算法(13):选择排序
选择排序法(Selection Sort)可使用两种方式进行排序,即在所有数据中,若从大到小排序,则将最大值放入第一个位置;若从小到大排序,则将最大值放入到最后一个位置。例如,假设是从小到大排序,一开始在所有数据中心挑选一个最小项放在第一个位置,在从第二项开始挑选一个最小项放在第二个位置,以此重复,直到完成排序位置。原创 2023-08-10 19:55:15 · 64 阅读 · 0 评论 -
数据结构和算法(14):插入排序
插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素拍好,再将第三个元素插入适当地位置,也就是说这三个元素莹然是已排序好的,接着将第四个元素加入,重复此步骤,直到排序完成为止。1.最坏情况和最平均情况需要n(n-1)/2次,时间复杂度为O(n^2);最好情况的时间复杂度为O(n)。4.此排序法适用于大部分数据已经排序或已排序数据库新增数据后进行排序的情况。5.因为插入排序法会造成数据的大量搬移,所以建议在链表上使用。3.因为只需要一个额外空间,所以空间复杂度为最佳。原创 2023-08-10 19:55:50 · 67 阅读 · 0 评论 -
数据结构和算法(15):快速排序
即它也是通过不断比较和移动交换来实现排序的,只不过它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数。快速排序( Quick Sort)的基本思想是: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。原创 2023-08-10 19:56:49 · 106 阅读 · 0 评论 -
数据结构和算法(16):归并排序
归并排序是一种高效、稳定的排序算法,采用分治法(Divide and Conquer)策略将问题分解为较小的子问题,逐步解决这些子问题,最终将结果合并为整体解决方案。在大规模数据排序中表现出色,时间复杂度为O(n log n)。本文将介绍归并排序的工作原理、算法示例、复杂度分析以及与其他排序算法的比较。归并排序的工作原理 归并排序的过程分为三个主要阶段:分割、解决和合并。分割阶段:将待排序的数组分为两个子数组,直到无法再分割为止。解决阶段:递归地对两个子数组进行排序,直到每个子数组只有一个元素。原创 2023-08-10 19:59:40 · 69 阅读 · 0 评论 -
数据结构和算法(17):堆排序
可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值》,然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如果可以做到每次在选择到最小记录的同时,并根据比较结果对其他记录做出相应的调整,那样排序的总体效率就会非常高了。原创 2023-08-10 20:01:17 · 74 阅读 · 0 评论 -
数据结构和算法(18):希尔排序
我们前一节讲的直接插入排序,应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,注意只是基本有序时,再对全体记录进行一次直接插入排序。我们需要采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。原创 2023-08-10 20:01:59 · 66 阅读 · 0 评论