数据结构(算法)

算法:
    数据结构中的算法,指的是数据结构所具备的功能
    解决特定问题的方法,学习的是前辈的优秀的经验总结

    五个特征:
        1、有穷性
        2、确定性
        3、可行性(有结果)
        4、输入(0个或者多个)
        5、输出(1个以上)

    如何评价一个算法:
        时间复杂度:    
            由于计算机的性能不同,无法准确地确定一个算法的执行时间
            因此使用执行算法的次数来代表算法的时间复杂度
            一般用O(公式)来表示
            注意:算法的时间复杂度不能完全反映一个算法的实际执行时间,有些算法看似复杂度高,但速度快,例如选择排序
        常见的时间复杂度:
            //O(1)
            printf("%d\n",num);

            //O(logN)(2为底)
            for(int i=1;i<=n;i*=2)
            {
                printf("%d\n",i);
            }

            //O(n)     只要用了循环就是O(n)            
            for(int i=0;i<n;i++)
            {
                printf("%d\n",i);
            }

            //O(NlogN)
            for(int i=0;i<N;i++)
            {
                for(int j=1;j<=N;j*=2)
                {
                    printf("%d",i);
                }
            }

            //O(n²)
            for(int i=0;i<N;i++)
            {
                for(int j=0;j<N;j++)
                {
                    printf("%d",i);
                }
            }
        空间复杂度:
            执行一个程序(算法)所需要的内存空间大小,是对一个算法在运行过程中临时占用存储空间大小的衡量
            通常来说,只要这个算法不涉及动态分配内存以及递归,空间复杂度通常是O(1)
            例如:求第N项斐波那契数列,空间复杂度O(N)
        注意:一个算法的时间复杂度、空间复杂度往往是相互影响的,如何选择根据实际情况

    分治:
        是一种算法思想、而不是某种特定的算法,把一个大而复杂的问题拆分,分解成很多小而简单的问题,利用计算机强大的计算能力来解决所有的小问题,从而解决最开始的问题
        实现分治的具体方法:循环、递归

查找算法:
    顺序查找:
        对待查找的数据没有特殊要求,从头到尾注意比较,在小规模的数据查找中较为常见,平均效率低。
        时间复杂度:O(N)
    二分查找(折半查找):
        对代差找的数据必须有序,从中间位置开始查找,如果中间值比key大,则从左边继续二分查找,否则从右边二分查找
        时间复杂度:O(logN)
    块查找(权重查找):
        是一种数据处理的思想,不是特定算法,当待处理的数据量很大时,可以根据数据的特征进行分块处理,如何再对每块数据进行查找
        例如:英文词典、通讯录
    哈希查找Hash:
        先把待查找的数据经过哈希函数,计算出该数据在哈希表中的位置,然后做标记,后续就可以很方便的查找数据,它的时间复杂度最高能到O(1)
        缺点:该算法有很大的局限性,不适合查找浮点型数据,需要额外的存储空间、空间复杂度高、是一种典型的以空间换时间的算法
        哈希函数设计方法:
            1、直接定址法:
                直接把数据作为它在哈希表中的位置来做标记
            2、数据分析法:
                先分析出数据的最大值、最小值,然后通过 最大值-最小值+1 来确定哈希表的长度,根据哈希函数 数据-最小值 进行标记和查找哈希表
            3、平方取中法、折叠法、随机数法等
        注意:无论哪种方法都可能会出现哈希冲突(有重复数据时无法确定具体数据),一般采用链表配合解决
        哈希函数的应用:MD5加密算法、SHA-1都属于哈希算法
排序算法:
    排序算法的稳定性:
        在待排序的数据中,对于数值相同的数据,在整个排序过程中,如果不会改变他们原来的先后顺序,则认为该排序算法稳定

    冒泡排序:
        数据左右比较,把较大的数据交换到右边,往后重复以上操作,直到把最大的数据交换到最后,特点是该算法堆数据的有序性敏感,如果在一次的排序过程中没有发生一次交换意味着数据已经有序,可以立刻停止排序
        适合待排序的数据基本有序时,则冒泡的效率非常高
        时间复杂度:平均O(N^2)  最优:O(N)
    选择排序:
        假定最开始的位置是当前的最小值并记录下标min,然后与后面所有的数据比较,如果有比min位置的值更小的数,那么更新min,结束后min的下标与开始时发生改变,才进行交换到开始位置。
        虽然时间复杂度较高,但是数据交换次数比较少,因此实际的运行速度并不慢(数据交换要比数据比较耗时)
        时间复杂度:平均O(N^2)  
        不稳定
    插入排序:
        把数据看成两个部分,前部分是有序的,把剩余部分的数据逐个往前比较,如果比前面的数小,前面的数往后移动一位,继续往前比,直到遇到更小的数,那么该数据的后一个位置即为可以插入的位置
        适合对已经排序后的数据新增数据后再排序
        时间复杂度:平均O(N^2)  
        稳定
    希尔排序:
        是插入排序的增强版,由于插入排序时数据移动的步长较短,都是1,所有增加了增连的概念,通过不停地缩减增量,最终步长还是变回1,可以提高排序效率
        当待排序数据远离最终位置时,希尔排序的效率高于插入排序
        时间复杂度:O(NlogN)~N(N²)
        不稳定
    ****快速排序:****
        在待排序数据中先找一个标杆位置p备份p的值val,记录左标杆l、右标杆r,l从p的左边找比val大的数,找到后赋值给p位置,更新p到l,然后r从p的右边找比val小的数,找到后赋值给p位置,更新p到r往复循环,直到l和r重合,把val还原回p位置,完成一次快排,然后用同样的方式对p左右两边的数据进行快排
        它的综合性能最优,因此得名快排,笔试时考的最多
        时间复杂度:O(NlogN)
        不稳定        
    堆排序:
        把待排序数据当作完全二叉树看待,先把二叉树调整成大顶堆结构,把根节点的值与末尾节点的值交换,然后数量范围-1,重新从上到下调整回大顶堆,继续以上操作,直到数量为1结束,此时全部数据就从小到大排序
        既可以顺序实现也可以递归实现
        时间复杂度:O(NlogN)
        不稳定


    归并排序:
        首先需要把数据拆分成单独的个体,然后按照从小到大的顺序比较后排序到一段临时空间中,把排序后的临时空间中的数据拷贝回原内存,然后依次把有序的个体继续以上操作,合并成更大的有序部分
        归并排序不需要交换数据,减少了交换的耗时,需要额外的存储空间,是一种典型的空间换时间的算法
        时间复杂度:O(NlogN)
        稳定
    计数排序:
    桶排序:
    基数排序:
posted @   歪爱慕外  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示