• Java 常用数据结构与算法


    一、数据结构

    数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排在一起的.

    通常情况下,精心选择的数据结构可以带来更高效的运行或者存储效率

    1、数据结构分类

    • 线性结构:   顺序表、链表、栈和队列、串、数组和广义表。
    • 非线性结构: 集合、树(二叉树)、图

    2、 常用的数据结构

     二、算法

    算法通常都是由类的方法来实现的。前面的数据结构,比如链表为啥插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。

    1、 算法的五个特征

    1. 有穷性:对于任意一组合法输入值,在执行又穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成。
    2. 确定性:在每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。
    3. 可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。
    4. 有输入:作为算法加工对象的量值,通常体现在算法当中的一组变量。有些输入量需要在算法执行的过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。
    5. 有输出:它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法功能。

    2、算法复杂度

    怎么去衡量不同算法之间的优劣呢?主要还是从算法所占用的时间空间两个维度去考量

    • 时间维度:是指执行当前算法所消耗的时间,通常用时间复杂度来描述。
    • 空间维度:是指执行当前算法需要占用多少内存空间,通常用空间复杂度来描述。

    因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而有时候时间和空间却又是不可兼得的,那么我们就需要从中去取一个平衡点。

     

    2.1 时间复杂度

    表示执行时间与数据规模之间的关系 

    常见的时间复杂度量级有:(由低到高8个)

    • 常数阶O(1)
    • 对数阶O(logN)
    • 线性阶O(n)
    • 线性对数阶O(nlogN)
    • 平方阶O(n²)
    • 立方阶O(n³)
    • K次方阶O(n^k)
    • 指数阶(2^n)

    上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。

     最好、最坏、平均、均摊时间复杂度

     1、常数阶O(1)

    1. int i = 10;
    2. int j = 20;
    3. i++;
    4. j++;
    5. int num = i + j;

     执行时,它并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,1都可以用O(1)来表示它的时间复杂度。

    2、线性阶O(n) 

    1. for (i = 1; i <= n; ++i) {
    2. k = i;
    3. k++;
    4. }

    执行时,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

    3. 对数阶O(logN)

    1. int i = 1;
    2. while (i < n) {
    3. i = i * 2;
    4. }

     在while循环里面,每次都将i乘以2,乘完之后,i距离n就越来越近了。我们试着求解一下,假设循环x次之后,i就大于2了,此时这个循环就退出了,也就是说2的x次方等于n,那么x = log2n。也就是说当循环log2n次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)。

    4. 线性对数阶O(nlogN)

    1. for (m = 1; m < n; m++) {
    2. i = 1;
    3. while (i < n) {
    4. i = i * 2;
    5. }
    6. }

     将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是n * O(logN),也就是了O(nlogN)。

    5. 平方阶O(n²)

    1. for (x = 1; i <= n; x++) {
    2. for (i = 1; i <= n; i++) {
    3. j = i;
    4. j++;
    5. }
    6. }

     如果把O(n)的代码再嵌套循环一遍,它的时间复杂度就是O(n²)了。

    6. 立方阶O(n³)、K次方阶O(n^k)

    参考上面的O(n²)去理解就好了,O(n³)相当于三层n循环,其它的类似 

    2.2  空间复杂度

    表示存储空间与数据规模之间的关系 

    空间复杂度比较常用的有:O(1)、O(n)、O(n²) 

     常用排序算法

  • 相关阅读:
    Q41F-25C软密封球阀型号解析
    redis 启动,关闭,查看状态
    iTOP-i.MX6ULL开发板修改 samba 配置文件
    算法的时间复杂度和空间复杂度
    Netty粘包拆包、自定义Protostuff编解码器
    LeetCode-219. 存在重复元素 II.(java)
    Mysql高级篇学习总结14:子查询优化、排序优化、GROUP BY优化、分页查询优化
    Less基础速学 —— 嵌套、变量、注释、&
    Spring MVC中如何进行页面重定向呢?
    HCIP-Datacom OSPF进阶(二)最常用的路由协议 OSPF各种LSA作用详解
  • 原文地址:https://blog.csdn.net/hlx20080808/article/details/134055592