IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 听课笔记——陈越老师《数据结构》第一章 -> 正文阅读

[数据结构与算法]听课笔记——陈越老师《数据结构》第一章

一、抽象数据类型 (Abstract Data Type)

1. 数据类型

  1. 数据对象集
  2. 数据集合相关联的操作集

2.抽象:描述数据类型的方法不依赖于具体实现

  1. 与存放数据的机器无关
  2. 与数据存储的物理结构无关
  3. 与实现操作的算法和编程语言均无关

二、算法(Algorithm)

  1. 一个有限的指令集
  2. 接受一些输入(有些情况下不需要输入)
  3. 产生输出
  4. 一定在有限步骤后终止
  5. 每一条指令必须
    有充分明确的目标,不可以有歧义
    计算机能处理的范围之内
    描述应不依赖于任何一种计算机语言以及具体的实现手段

三、算法的复杂度

  1. 空间复杂度S(n): 根据算法写成的程序在执行时占用储存单元的长度
  2. 时间复杂度T(n): 根据算法写成的程序在执行时消耗时间的长度。(另: 若一个算法的时间复杂度为n2,应想办法将其降为nlog(n))

四、应用实例:最大子列和问题

算法1: T(n) = O(n3)

int maxSubseqSum1(int arr[], int n)  // 算法1, T(n) = O(n^3)
{
    int maxSum{}, thisSum;  // thisSum表示当前求得的子列和
    for (int i{}; i< n; i++) {  // i表示子列左端
        for (int j{i}; j< n; j++) { // j表示子列右端
            thisSum = 0;
            for (int k{i}; k <=j; k++) {
                thisSum += arr[k];
            }
            if (thisSum> maxSum) {  // 若当前子列和比之前记录的最大子列和更大
                maxSum = thisSum;   // 则更新最大子列和
            }
        }
    }
    return maxSum;
}

算法2: T(n) = O(n2)

int maxSubseqSum2(int arr[], int n)
{
    int maxSum{}, thisSum;  // thisSum表示当前求得的子列和
    for (int i{}; i< n; i++) {  // i表示子列左端
        thisSum = 0;
        for (int j{i}; j< n; j++) {
            thisSum += arr[j];
            if (thisSum> maxSum) {  // 若当前子列和比之前记录的最大子列和更大
                maxSum = thisSum;   // 则更新最大子列和
            }
        }
    }
    return maxSum;
}

算法3(分而治之): T(n) = O(nlog(n))
将数组从中间分开处理,分别计算左右两半边的最大子列和,同时计算跨越中间区域的最大子列和,返回这三者中的最大值。
其时间复杂度等于处理左右半边的时间复杂度加上处理跨区元素的时间复杂度(三部分之和),即(假设处理一个元素的时间复杂度T(1) = O(1)):
T(n)
= T(n / 2) + T(n / 2) + O(n)
= 2 * T(n / 2) + c * n 注: 这里(c * n)为n的常数倍,即处理n个O(1)所需的时间
= 2 * [2 * T(n / 22) + c * (n / 2)] + c * n
= 22T(n / 22) + 2 * c * n
以此类推,假设经过k步调用后需处理的元素只剩下一个,有:
T(n)
= 2kT(n / 2k) + k * c * n 其中: n / 2k = 1
= n * O(1) + c * n * log(n)
= O(n) + O(nlog(n))
当两个不同的复杂度加在一起时,取较大的那一项,所以:
T(n) = O(nlog(n))

int maxSubseqSum3(int arr[], int fir, int last)
{
    if (fir == last) {  // 若递归至只用处理一个元素
        return arr[fir];    // 则返回那一个元素
    }
    int leftMax, rightMax, maxSum{};    // leftMax表示左边的最大子列和, rightMax表示右边的最大子列和
    leftMax = maxSubseqSum3(arr, fir, (fir + last) / 2);    // 递归调用
    rightMax = maxSubseqSum3(arr, (fir + last) / 2 + 1, last);
    for (int i{(fir + last) / 2}, thisSum{arr[i]}; i >=fir; i--, thisSum += arr[i]) {   // 处理跨越中间点的最大子列和,从中间开始往左扫描
        if (thisSum> maxSum) {  // 若当前子列和大于之前记录的最大子列和
            maxSum = thisSum;   // 则更新最大子列和
        }
    }
    for (int i{(fir + last) / 2 + 1}, thisSum{arr[i]}, tmpMaxSum{maxSum}; i <=last; i++, thisSum += arr[i]) {   // 往右扫描, tmpMaxSum记录扫描前maxSum的值
        if (thisSum> maxSum - tmpMaxSum) {  // 若当前子列和大于之前记录的最大子列和
            maxSum = tmpMaxSum + thisSum;   // 则更新最大子列和
        }
    }
    if (leftMax> maxSum) {  // 若左边返回的最大子列和大于之前记录的最大子列和
        maxSum = leftMax;   // 则将leftMax赋值给maxSum
    }
    if (rightMax> maxSum) { // 若左边返回的最大子列和大于之前记录的最大子列和
        maxSum = rightMax;  // 则将rightMax赋值给maxSum
    }
    return maxSum;
}

算法4(在线处理): T(n) = O(n)

int maxSubseqSum4(int arr[], int n)
{
    int maxSum{}, thisSum{};    // thisSum表示当前子列和
    for (int i{}; i< n; i++) {
        thisSum += arr[i];  // 向右累加
        if (thisSum> maxSum) {  // 若当前子列和大于之前记录的最大子列和
            maxSum = thisSum;   // 则更新最大子列和
        }
        if (thisSum< 0) {   // 若当前子列和为负数, 说明其会对后面的子列和起副作用(与后面的子列和结合后会使后面的子列和变小, 所以应使当前子列和清零)
            thisSum = 0;    // 则令当前子列和为0, 并继续计算后面的子列和
        }
    }
    return maxSum;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:41:03  更:2021-08-10 13:41:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 1:13:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计