数据结构与算法精讲:程序员节必须掌握的6个核心知识点

第一章:程序员节算法题

每年的10月24日是程序员节,各大技术社区和公司都会举办趣味编程挑战。本章精选一道经典算法题,帮助读者在节日氛围中提升编码能力。

问题描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数,并返回它们的数组下标。假设每种输入只对应一种答案,且不能重复使用同一个元素。

解题思路

使用哈希表(map)记录已遍历的数值及其索引。对于每个元素,检查是否存在另一个数与当前数之和等于目标值。若存在,则立即返回两个索引。

Go语言实现

func twoSum(nums []int, target int) []int {
    // 创建哈希表存储值和索引
    numMap := make(map[int]int)
    
    for i, num := range nums {
        // 计算补数
        complement := target - num
        
        // 检查补数是否已在 map 中
        if index, found := numMap[complement]; found {
            return []int{index, i}
        }
        
        // 将当前数值和索引存入 map
        numMap[num] = i
    }
    
    // 根据题目假设,总会找到解
    return nil
}

测试用例

  • 输入: nums = [2, 7, 11, 15], target = 9 → 输出: [0, 1]
  • 输入: nums = [3, 2, 4], target = 6 → 输出: [1, 2]
  • 输入: nums = [3, 3], target = 6 → 输出: [0, 1]

复杂度分析

项目复杂度
时间复杂度O(n)
空间复杂度O(n)
graph TD A[开始遍历数组] --> B{计算 target - nums[i]} B --> C[检查哈希表中是否存在] C --> D[存在: 返回索引] C --> E[不存在: 存入哈希表] E --> F[继续遍历] D --> G[结束] F --> B

第二章:时间复杂度与空间复杂度分析

2.1 算法效率的数学基础:大O表示法

在分析算法性能时,大O表示法(Big O notation)用于描述程序最坏情况下的时间或空间复杂度,它关注输入规模增长时资源消耗的增长趋势。
常见复杂度等级对比
  • O(1):常数时间,如数组随机访问;
  • O(log n):对数时间,如二分查找;
  • O(n):线性时间,如遍历数组;
  • O(n²):平方时间,如嵌套循环比较。
代码示例与分析
def find_max(arr):
    max_val = arr[0]
    for i in range(1, len(arr)):  # 循环执行 n-1 次
        if arr[i] > max_val:
            max_val = arr[i]
    return max_val
该函数遍历数组一次,时间复杂度为 O(n)。其中 n 为数组长度,每步操作为常数时间,整体呈线性增长。

2.2 常见复杂度对比与实际性能影响

在算法设计中,时间复杂度直接影响程序在大规模数据下的执行效率。常见的复杂度如 O(1)、O(log n)、O(n)、O(n log n) 和 O(n²) 在实际应用中的表现差异显著。
常见复杂度性能对照
复杂度数据规模 n=10⁵ 时操作数典型场景
O(1)1哈希表查找
O(log n)~17二分查找
O(n)10⁵线性遍历
O(n log n)~1.7×10⁶快速排序
O(n²)10¹⁰冒泡排序
代码实现对比
func binarySearch(arr []int, target int) int {
    left, right := 0, len(arr)-1
    for left <= right {
        mid := (left + right) / 2
        if arr[mid] == target {
            return mid
        } else if arr[mid] > target {
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return -1 // O(log n) 时间复杂度
}
该函数通过每次将搜索区间减半,实现对有序数组的高效查找。相比 O(n) 的线性搜索,当数据量达到百万级时,性能优势超过万倍。

2.3 递归算法的复杂度推导技巧

分析递归算法的时间复杂度,关键在于建立递推关系并求解其渐近行为。常用方法包括代入法、递归树法和主定理。
递归树与成本分解
以归并排序为例,其递归式为 $ T(n) = 2T(n/2) + O(n) $。构建递归树可知每层代价为 $ n $,共 $ \log n $ 层,总复杂度为 $ O(n \log n) $。

int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n-1) + fibonacci(n-2); // 指数级重复计算
}
上述代码时间复杂度为 $ O(2^n) $,因每次调用产生两个子问题,且无记忆化机制。
主定理的应用场景
对于形如 $ T(n) = aT(n/b) + f(n) $ 的递推式,可通过主定理快速判断:
  • 若 $ f(n) = O(n^c) $ 且 $ c < \log_b a $,则 $ T(n) = \Theta(n^{\log_b a}) $
  • 若 $ f(n) = \Theta(n^{\log_b a}) $,则 $ T(n) = \Theta(n^{\log_b a} \log n) $
  • 若 $ f(n) = \Omega(n^c) $ 且 $ c > \log_b a $,则 $ T(n) = \Theta(f(n)) $

2.4 多层循环与嵌套操作的复杂度计算

在算法分析中,多层循环结构是影响时间复杂度的关键因素。当循环嵌套发生时,其执行次数呈乘积关系增长。
嵌套循环的基本模式
以双重循环为例,外层执行 n 次,内层每次执行 m 次,则总操作数为 n × m:

for i in range(n):        # 执行 n 次
    for j in range(m):    # 每次外层循环中执行 m 次
        print(i, j)       # 基础操作
上述代码的时间复杂度为 O(n×m)。若 n 与 m 相关(如 m = n),则退化为 O(n²)。
复杂度增长趋势对比
嵌套层级示例结构时间复杂度
单层for i in range(n)O(n)
两层for i; for jO(n²)
三层for i; for j; for kO(n³)
随着嵌套深度增加,算法性能急剧下降,应尽量避免不必要的深层嵌套。

2.5 实战:优化低效代码的时间复杂度

在实际开发中,常见的性能瓶颈往往源于高时间复杂度的实现。以查找数组中是否存在两数之和等于目标值为例,暴力解法的时间复杂度为 O(n²):

// 暴力解法:O(n²)
public boolean twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] == target) {
                return true;
            }
        }
    }
    return false;
}
该实现通过双重循环遍历所有数对,效率低下。 通过引入哈希表,可将查找时间降为 O(1),整体复杂度优化至 O(n):

// 哈希表优化:O(n)
public boolean twoSum(int[] nums, int target) {
    Set seen = new HashSet<>();
    for (int num : nums) {
        if (seen.contains(target - num)) {
            return true;
        }
        seen.add(num);
    }
    return false;
}
每次迭代检查补数是否存在,若不存在则存入集合,空间换时间。 优化前后对比:
方案时间复杂度空间复杂度
暴力匹配O(n²)O(1)
哈希表O(n)O(n)

第三章:数组与链表的底层实现与应用

3.1 数组内存布局与随机访问优势

数组在内存中以连续的块形式存储,每个元素按声明顺序依次排列。这种紧凑布局使得通过基地址和偏移量即可快速定位任意元素,实现 O(1) 时间复杂度的随机访问。
内存布局示意图
地址: 1000 → [元素0] | 1004 → [元素1] | 1008 → [元素2] | ... (假设每个元素占4字节,int 类型)
访问机制分析
  • 基地址(Base Address):数组首元素的内存地址
  • 步长(Stride):单个元素所占字节数
  • 计算公式:&arr[i] = Base + i × Stride
int arr[5] = {10, 20, 30, 40, 50};
printf("%d\n", arr[3]); // 直接计算内存偏移,访问arr[3]
上述代码中,编译器通过基地址加上 3 × sizeof(int) 的偏移量直接读取值,无需遍历,显著提升访问效率。

3.2 单向与双向链表的操作对比分析

结构定义差异
单向链表节点仅包含数据域和指向后继的指针,而双向链表额外维护指向前驱的指针,提升反向遍历能力。

// 单向链表节点
struct ListNode {
    int data;
    struct ListNode* next;
};

// 双向链表节点
struct DoublyNode {
    int data;
    struct DoublyNode* prev;
    struct DoublyNode* next;
};
上述代码展示了两种链表的结构体定义。双向链表多一个 prev 指针,支持反向访问,但增加内存开销。
操作性能对比
  • 插入/删除:双向链表在已知节点位置时效率更高,无需遍历查找前驱;
  • 遍历方向:单向链表仅支持正向,双向链表可双向移动;
  • 空间开销:双向链表每个节点多一个指针域,占用更多内存。
操作单向链表双向链表
插入(已知位置)O(n)O(1)
删除(已知位置)O(n)O(1)
反向遍历不支持支持

3.3 在真实场景中选择数组还是链表

在实际开发中,数据结构的选择直接影响系统性能和可维护性。数组和链表各有优势,需根据访问模式、插入频率和内存约束综合判断。
频繁随机访问:优先选择数组
数组支持 O(1) 的随机访问,适合需要快速定位的场景,如图像像素处理或矩阵运算。

int arr[1000];
for (int i = 0; i < 1000; i++) {
    printf("%d ", arr[i]); // 直接索引访问
}
上述代码利用连续内存特性实现高效遍历,缓存命中率高。
高频插入删除:链表更优
链表在中间位置插入删除为 O(1),适用于日志队列、浏览器历史记录等动态数据。
  • 数组:插入需移动元素,时间复杂度 O(n)
  • 链表:仅修改指针,常数时间完成
场景推荐结构理由
静态数据查询数组缓存友好,访问快
动态增删频繁链表无需移动,灵活扩容

第四章:经典排序与查找算法深度解析

4.1 冒泡、插入与快速排序的实现与优化

基础排序算法的实现
冒泡排序通过重复遍历数组,比较相邻元素并交换位置来实现排序。虽然时间复杂度为 O(n²),但其代码简洁,适合小规模数据。
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
该实现中,外层循环控制轮数,内层循环完成每轮比较,相邻元素逆序时交换。
插入排序的优化思路
插入排序在局部有序序列中表现优异,平均时间复杂度同样为 O(n²),但实际性能优于冒泡。
  • 每次将未排序元素插入已排序部分的正确位置
  • 适用于近乎有序的数据场景
  • 可提前终止内层比较,减少无效操作
快速排序的分治策略
快速排序采用分治法,通过基准值划分数组,递归排序子区间,平均时间复杂度为 O(n log n)。
def quick_sort(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quick_sort(arr, low, pi - 1)
        quick_sort(arr, pi + 1, high)
partition 函数确定基准位置,确保左侧小于基准,右侧大于基准,递归处理两部分。

4.2 归并排序的分治思想与稳定排序特性

归并排序基于分治法(Divide and Conquer)设计,将数组递归地分割为两个子数组,分别排序后再合并成有序序列。其核心分为“分解”和“合并”两个阶段。
分治策略解析
分解过程持续将数组从中点切分,直到子数组长度为1;合并阶段则通过比较两子数组元素,依次将较小值放入结果数组,确保顺序性。
稳定排序保障
归并排序是稳定的排序算法,即相等元素的相对位置在排序后不会改变。这得益于合并过程中,当左右元素相等时优先取左侧元素。
func mergeSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    mid := len(arr) / 2
    left := mergeSort(arr[:mid])
    right := mergeSort(arr[mid:])
    return merge(left, right)
}

func merge(left, right []int) []int {
    result := make([]int, 0, len(left)+len(right))
    i, j := 0, 0
    for i < len(left) && j < len(right) {
        if left[i] <= right[j] { // 相等时取左,保持稳定性
            result = append(result, left[i])
            i++
        } else {
            result = append(result, right[j])
            j++
        }
    }
    result = append(result, left[i:]...)
    result = append(result, right[j:]...)
    return result
}
上述代码中,mergeSort 实现分治递归,merge 函数通过双指针合并有序数组,并利用 <= 判断维持稳定性。

4.3 二分查找的前提条件与边界处理技巧

前提条件分析
二分查找仅适用于有序数组,且支持随机访问。若数据未排序,需先排序再查找,时间复杂度将由 O(log n) 上升至 O(n log n)。
边界处理常见陷阱
循环终止条件选择不当易导致死循环。推荐使用 left < right 避免越界,并通过调整中点偏移防止无限逼近。
func binarySearch(nums []int, target int) int {
    left, right := 0, len(nums)
    for left < right {
        mid := left + (right-left)/2
        if nums[mid] == target {
            return mid
        } else if nums[mid] < target {
            left = mid + 1
        } else {
            right = mid
        }
    }
    return -1
}
上述代码采用左闭右开区间 [left, right),mid 取下整,当 nums[mid] < target 时,搜索区间更新为 [mid+1, right),确保边界收缩。

4.4 排序算法在大数据场景下的选择策略

在处理大规模数据集时,排序算法的选择直接影响系统性能与资源消耗。传统比较类算法如快速排序在内存充足的小数据量场景表现优异,但在大数据环境下则面临内存瓶颈。
外部排序的必要性
当数据无法全部加载进内存时,需采用外部排序。其核心思想是分治:先将数据分块排序,再通过多路归并整合结果。

def external_sort(file_paths, chunk_size):
    # 分块读取并排序
    sorted_chunks = []
    for path in file_paths:
        chunk = read_chunk(path, chunk_size)
        chunk.sort()
        sorted_chunks.append(chunk)
    # 多路归并
    return merge_k_sorted_arrays(sorted_chunks)
该代码展示了外部排序的基本流程。chunk_size 控制每次加载的数据量,避免内存溢出;merge_k_sorted_arrays 使用最小堆优化合并过程,时间复杂度为 O(N log k),其中 k 为分块数。
算法选择建议
  • 内存足够:优先使用快速排序或 Timsort(Python 内置)
  • 磁盘数据:选用外部排序,结合缓冲区优化 I/O
  • 近似有序:插入排序或归并排序更高效

第五章:总结与展望

技术演进中的架构选择
现代分布式系统对高可用性与弹性伸缩提出了更高要求。以某电商平台为例,其订单服务在大促期间通过 Kubernetes 动态扩缩容,结合 Istio 实现灰度发布,显著降低了故障率。该实践表明,云原生技术栈已成为保障业务连续性的核心手段。
代码级优化的实际案例
在性能敏感场景中,Go 语言的并发模型展现出优势。以下代码展示了如何通过 context 控制超时,避免 goroutine 泄漏:

ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
defer cancel()

result := make(chan string, 1)
go func() {
    result <- slowRPC()
}()

select {
case res := <-result:
    log.Println("Success:", res)
case <-ctx.Done():
    log.Println("Request timed out")
}
未来趋势与技术储备
技术方向应用场景推荐工具链
边缘计算物联网数据预处理KubeEdge, eKuiper
Serverless事件驱动型任务OpenFaaS, Knative
AIOps异常检测与根因分析Prometheus + ML pipeline
  • Service Mesh 正从单集群向多控制面联邦发展,支持跨地域服务治理
  • WASM 在 proxy layer 的集成试点已在 Envoy 中落地,提升插件安全性
  • OpenTelemetry 成为统一遥测标准,逐步替代分散的 tracing SDK
[用户请求] → API Gateway → Auth Service ↓ [Valid? 是] → Rate Limiter → Service A ↓ 否 [返回 401]
京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析 在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所... 阅读详情

相关推荐

Oracle19c时区升级实战:从32到42版本的数据泵TSTZ报错解决方案

本文详细介绍了Oracle19c时区版本从32升级到42的实战步骤,重点解决数据泵TSTZ报错问题。通过检查时区版本、下载补丁包、应用补丁及执行升级脚本等关键操作,确保数据库时区数据更新,避免夏令时转换错误和历史时区规则不匹配等问题。文章还提供了常见问题排查和升级后的注意事项,帮助DBA高效完成时区升级任务。

n7o8p的博客 285

【1024程序员节代码大赛备战指南】:掌握五大核心算法,冲刺冠军宝座

auto-generated

IterStream的博客 863

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4656

2023年1024程序员节B站答题怎么拿满分?这7个知识点必须掌握

auto-generated

InitFlow的博客 933

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 187

第1章 环境准备

本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核

幸福街--linux技术分享 211

【1024程序员节B站答题全攻略】:掌握这10道题,轻松赢取限定奖品

auto-generated

CodePulse的博客 815

华为OD机试 - 统计文本数量(Java 2025 A卷 100分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1438

1024程序员节如何突围?:掌握这3项核心能力让你薪资翻倍

auto-generated

FastProceed的博客 1092

【SpringBoot笔记44】SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置)

在SpringBoot应用开发中,一般情况下,都是只会配置一个数据源信息,之后整个工程都是对当前数据源进行增删改查的操作。但是,在实际开发里面,也有可能会遇到多数据源的情况,例如:当前工程中除了需要访问自己应用的数据库,还需要直接连接第三方系统的数据库进行业务处理,这种情况下,就需要进行多数据源的配置。SpringBoot考虑到了这一点,所以它是支持多数据源的配置的,下面介绍一下如何配置多数据源。

✅ Java 开发工程师 1118

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1703

B站程序员节答题全攻略(2024最新题库+答案解析)

auto-generated

VarChat的博客 838

【实验】ENSP 实战:酒店有线 + 无线三层组网全配置(VLAN 规划 + AC/AP+SSID 绑定)

三层架构:出口路由器 → 核心交换机 → 汇聚交换机 → 接入交换机 / AP / 终端。

jundao1997的专栏 431

【B站1024程序员节答题通关秘籍】:掌握这5大高频题型,轻松拿满分奖励

auto-generated

SimTrans的博客 785

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2024最新1024程序员节答题题库曝光(限时领取,仅限前1000人)

auto-generated

ByteShoal的博客 967

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

B站1024程序员节答题怎么破?一文搞定历年真题规律与速通策略

auto-generated

ByteShoal的博客 962

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【大厂算法面试通关秘籍】:1024程序员节独家披露Python高频考题TOP 6

掌握大厂算法面试核心技巧,深度解析1024程序员节Python高频考题TOP6。涵盖动态规划、二叉树遍历等经典题型,结合真实面试场景与高效解题思路,提升编程实战能力。1024程序员节Python面试高频算法题解析,值得收藏。

PixelStream的博客 808

如何借势程序员节实现技术跃迁?,这6个实战路径必须掌握

程序员节社区推荐6大实战路径,助你借势技术跃迁。涵盖技能升级、项目实践、开源贡献等关键方法,适用于开发者突破瓶颈、提升竞争力。紧跟技术趋势,实现高效成长,值得收藏。

StepNexus的博客 264

1024算法进阶指南(程序员节精选真题精讲)

掌握算法进阶核心技巧,破解1024程序员节算法题不再难。精选高频真题深度解析,覆盖动态规划、递归优化等关键方法,适用于技术面试与竞赛提分。思路清晰,代码规范,值得收藏。

VarPerch的博客 343

【1024程序员节答题夺奖指南】:从零基础到TOP10,只需这6步逆袭法

auto-generated

ByteChat的博客 862

揭秘1024程序员节答题赛真题:5类必考知识点全解析,助你稳进前三甲

auto-generated

FastProceed的博客 898

【1024程序员节答题赛通关宝典】:掌握这10道高频算法题,轻松斩获高分

auto-generated

LiteProceed的博客 770

【B站1024程序员节题目答案全解析】:掌握历年真题核心考点,冲刺满分必备指南

auto-generated

PixelWander的博客 837

揭秘1024程序员节B站高分答题技巧:如何5分钟内满分通关

auto-generated

PixelFlow的博客 621

bibi1024程序员节答案曝光:5大核心考点逐行解读,助你斩获满分

auto-generated

CompiTide的博客 785

1024程序员节B站答题拿限定皮肤?这份标准答案你必须拥有

auto-generated

DeepLens的博客 1022
上一篇: HTML5语义化标签使用指南(提升SEO与可访问性的终极方案)
下一篇: 揭秘Selenium与Pytest协同工作原理:打造高稳定性自动化测试体系
SimCompile
博客等级 码龄1年 140粉丝 2012原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值