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

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

Ⅰ.  系统生命周期 | 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

本章完。

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
25 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
5天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
25 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
11天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
30 3
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
32 4
|
30天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
33 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
17 1
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
13 0