【数据结构原理】系统生命周期 | 算法规范 | 笔记

简介: 【数据结构原理】系统生命周期 | 算法规范 | 笔记

Ⅰ.  系统生命周期 | SYSTEM LIFE CYCLE

0x00 需求

一组定义 Project 目的的规格;输入 / 输出。

0x01 分析

将问题分解为可管理的部分;自下而上 / 自上而下 的设计。

0x02 设计

抽象数据类型的创建;算法规范和算法设计策略的考虑(与语言无关)。

0x03 完善代码

对数据对象选择表示的方式,并为它们的每个操作编写算法。

数据对象的表示方法可以决定与之相关算法的效率。

0x04 检查

验证程序设计的正确性,利用各种测试用例来测试程序。

消除错误,性能分析(运行时间,所占内存)。

Ⅱ. 算法规范 | Algorithm Specification

0x00 介绍

定义:算法是一组有限的指令,如果遵循这些指令,可以完成特定的任务。

所有算法都必须满足以下标准:

(1)输入 (2)输出 (3)确定性 (4)有限性 (5)有效性

算法 / 程序(过程)

如何设计算法?    自然语言 → 流程图 → 程序语言

0x01 例子 - 选择排序

Sorting a set of n≥1 integers

💬 从一组未排序的整数中找出最小的,并将其放在排序列表的下一个位置。

for (i = 0; i < n; i++) {
    检查 list[i] 到 list[n-1]
    并假设最小的整数在 list[min] 处;
    交换 list[i] 和 list[min] 的值;
}

📚 步骤:

Step1:找到最小的整数

Step2:交换

📜 函数版本:

void Swap(int* px, int* py) {
    int tmp = *px;
    *px = *py;
    *py = tmp;
}
Swap(&a, &b);

📜 宏版本:

#define SWAP(x,y,t) ((t) = (x), (x) = (y), (y) = (t))

📌 都准备好了,我们可以开始写选择排序了:

#define SWAP(x,y,t) ((t) = (x), (x) = (y), (y) = (t))
void Sort(int list[], int n) {
    int min = 0;
    int tmp = 0;
    int i = 0;
    int j = 0;
    for (i = 0; i < n - 1; i++) {
        min = i;
        for (j = i + 1; j < n; j++) {
            if (list[j] < list[min]) {
                min = j;
            }
            SWAP(list[i], list[min], tmp);
        }
    }
}

🔑 解读:函数 Sort 对一个 n≥1 的整数数组进行排序,结果保留在 list[0],... ,list[n-1] 中。最后达到要求 list[0]≤list[1]≤ . . . ≤list[n-1]  。

0x02 例子 - 二分查找

查找目标值是否在列表中,如果在,返回该整数的下标,否则返回 -1  (升序)

将列表的中间值和目标值进行对比,有三种情况:

① 目标值 < 中间值

如果目标值存在且位置在 left 和 middle - 1 之间,将 right 设为 middle - 1 。

② 目标值 = 中间值

找到了,返回 middle。

③ 目标值 > 中间值

如果目标值存在且位置在 middle + 1 和 right 之间,将 left 设为 middle + 1 。

📜 分析:

循环(还有整数没检查完) 
{
    中间值 = (左 + 右) / 2;
    如果真(目标值 < list[中间值])
        右 = 中间值 - 1;
    或者(目标值 == list[中间值])
        返回 中间值;
    否则
        左 = 中间值 + 1;
}

📌 处理 return:

<                             -1

=         return          0

>                              1

📜 函数的方式实现:

int cmp(int x, int y) {
    if (x < y) {
        return -1;
    } else if (x == y) {
        return 0;
    } else {
        return 1;
    }
}

📜 宏的方式实现:

# define CMP (x,y) ((x) < (y)) ? -1: ((x) == (y)) ? 0: 1)

💬 代码实现:

int BinarySearch(int list[],int targetNum, int left, int right) {
    int middle = 0;
    while (left <= right) {
        middle = (left + right) / 2;
        switch(Compare(list[middle], targetNum)) {
            case -1: 
                left = middle + 1;
                break;
            case 0: 
                return middle; 
                break;
            case 1: 
                right = middle - 1; 
                break;
        }
    }
    return -1;
}

0x03 递归算法 | Recursive Algorithms

【直接递归】

【间接递归】

📚 递归是一种通用的控制方案,通常递归函数相较于其迭代函数更容易理解,许多问题可以以自然的方式进行递归定义。

二项式系数:

可以通过以下公式递归计算:

比如阶乘、二分查找、斐波那契数列……

💬 排列组合:

我们可以通过打印来构建排列组合的集合。

(1) a后面是(b, c, d)的所有排列组合

(2) b后面是(a, c, d)的所有排列组合

(3) c后面是(a, b, d)的所有排列组合

(4) d后面是(a, b, c) 的所有排列组合

💬 我们先来看一下斐波拉契数列的迭代法实现:

int Fib(int n) {
    int a = 0;
    int b = 0;
    int c = 0;
    if (n > 1) {
        a = 0;
        b = 1;
        for (int i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
    }
    else {
        c = n;
    }
    return c;
}

💬 递归的方法实现斐波那契数列:

int rFib(int n) {
    if (n > 1) {
        return rFib(n - 1) + rFib(n - 2);
    } else {
        return n;
    }
}

💬 递归版本的二分查找:

int BinarySearch(int list[],int targetNum, int left, int right) {
    int middle = 0;
    if (left <= right) {
        middle = (left + right) / 2;
        switch(Compare(list[middle], targetNum)) {
            case -1: return BinarySearch(list, targetNum, middle + 1, right);
            case 0: return middle;
            case 1: return BinarySearch(list, targetNum, left, middle - 1);
        }
    }
    return -1;
}

💬 排列组合:

void perm(char *list, int i, int n) {
    /* 生成 list[i] 到 list[n] 的所有排列组合 */
    int j, temp;
    if (i == n) {
        for (j=0; j<=n; j++) {
            printf("%c", list[j]);
        }
        printf(" ");
    } else {
        /* list[i] 到 list[n] 有一个以上的排列组合,递归生成这些排列组合 */
        for (j=i; j<=n; j++) {
            SWAP(list[i], list[j], temp);
            perm(list, i+1, n);
            SWAP(list[i], list[j], temp);
        }
    }
}

参考资料:

Fundamentals of Data Structures in C

本章完。

相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
20 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
14天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
109 66
|
2天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
16 2
|
18天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
53 20
|
8天前
|
算法
基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真
本课题基于爬山法MPPT算法,对光伏发电系统进行Simulink建模与仿真。使用MATLAB2022a版本,通过调整光伏电池的工作状态以实现最大功率输出。爬山法通过逐步优化工作点,确保光伏系统在不同条件下均能接近最大功率点。仿真结果显示该方法的有效性,验证了模型的正确性和可行性。
|
10天前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
23 7
|
16天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
47 5
|
14天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
4天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
5天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真