1问:常见的数据结构有哪些?以及他们都是如何实现的?
答:
常见的数据结构包括:数组、链表、栈、队列、树、堆、哈希表、图等。下面分别介绍它们的实现方法。
(1)数组
数组是一组连续的内存空间组成的数据结构,元素的访问非常快。实现一个数组需要定义一个固定大小的内存空间,并为每个元素分配一个地址,可以通过下标索引来访问对应位置的元素。
(2)链表
链表是一组通过指针连接起来的节点组成的数据结构,允许动态的插入和删除元素,并且不需要预先知道链表的大小。实现一个链表需要定义一个节点结构体,包含该节点的值和指向下一个节点的指针。
(3)栈
栈是一种后进先出(LIFO)的数据结构,类比于一摞书,只能从栈顶放入和弹出元素。实现一个栈需要定义一个固定大小的内存空间,并且为每个元素分配一个地址,通过指针指向栈顶元素。
(4)队列
队列是一种先进先出(FIFO)的数据结构,类比于排队,只能在队尾插入元素,在队头删除元素。实现一个队列需要定义一个固定大小的内存空间,并且为每个元素分配一个地址,通过指针指向队头和队尾元素。
(5)树
树是一种分层结构的数据结构,包含了一个根节点和若干子节点,每个节点可能有若干个子节点。实现一棵树需要定义一个节点结构体,包含该节点的值和指向子节点的指针。
(6)哈希表
哈希表是一种利用哈希函数将键映射到存储桶中的数据结构,可以在常数时间内通过键来访问值。实现一个哈希表需要定义一个哈希函数来将键映射到桶的索引位置,然后通过链表或开放寻址法来解决冲突。
2问: stm32的中断体系?
答:
在 STM32 中断系统中,中断控制器(NVIC)是核心部件,它控制着所有的中断请求以及中断优先级的排序和响应。每个可中断的外设都有一个中断线(IRQ),可以通过 NVIC 连接到中央处理器(CPU)。
在 STM32 中,中断请求分为两类:内部中断和外部中断。
(1)内部中断
内部中断通常是由处理器自身或者与处理器紧密耦合的外设产生的。常见的内部中断有:
系统滴答定时器(SysTick)中断:用于实现操作系统的时间片轮转调度等功能。
时钟和功率管理单元(RCC)中断:用于处理时钟和电源管理相关的事件。
通用形式验证器(CRC)中断:用于 CRC 校验相关的事件。
相位锁定环(PLL)中断:用于处理时钟相关的事件。
在 STM32 中,内部中断可以通过 CMSIS(Cortex-M 软件接口标准)内置的 NVIC 服务程序接口来操作。
(2)外部中断
外部中断通常是由外设产生的,例如按键、温度传感器等,可以通过 GPIO 外部中断、外部中断控制器(EXTI)或者外设自身的中断线来触发。
在 STM32 中,外部中断主要有以下三种触发方式:
a. GPIO 外部中断触发器
GPIO 外部中断是通过 GPIO 可编程门阵列的某些 IO 引脚来实现的。具体可参考 STM32 中文参考手册。
b.EXTI 外部中断触发器
EXTI 外部中断触发器是一种通用的中断触发器,可以通过外设的中断线连接到 EXTI 控制器。可以为每个 IO 引脚单独配置触发条件和优先级,支持上升沿、下降沿、边沿等触发方式。
c.外设传输控制器(DMA)
DMA 是一种数据传输方式,可以通过 DMA 控制器实现外设的 DMA 传输。DMA 控制器可以通过中断请求(DMA 中断)来通知处理器传输完成。这种方式也可以看作是一种外部中断触发器。
在 STM32 中,外部中断通常也可以通过 CMSIS 内置的 NVIC 服务程序接口来操作。
3问:哈希、二分法(又让讲讲二分法的思想)
答:
(1)哈希
哈希是一种将任意长度的输入数据映射为固定长度输出数据的函数,这个输出数据通常称为哈希值或散列值。哈希函数将输入值映射到散列值,使得散列值能够很好地表示输入值,并且在查找时可以快速地定位到与之匹配的键。
哈希函数的核心思想是将大量数据映射到有限的空间中,这样就可以通过使用一些快速的数据结构,例如哈希表,快速地查找和处理数据。哈希函数的特点是输入值的任何小的变化都会导致输出值的不可预知的变化,因此它们通常在密码学、数据完整性和安全编码等领域中得到广泛应用。
(2)二分法
二分法是一种搜索算法,它被用来查找已排序数组中的特定元素。它通过将搜索区间一分为二来减少搜索的范围,最终找到匹配的元素。
二分法的核心思想是将要搜索的范围逐渐缩小,将复杂度从 O(n) 降低到 O(log n)。这种算法的实现通常需要排序,因为二分法只适用于已排序的数据结构。这种算法在数据库、图像处理、计算几何等领域中得到广范应用。