数据结构与算法分析
心跳包
硕士研究生,嵌入式软件开发,蓝牙,IOT,人工智能方向
展开
-
排序算法详解
关于快速排序的逻辑原理是这样的: 将两个指针i,j分别指向表的起始和最后的位置,T为临时变量。 反复操作以下两步: (1)j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。 (2)i逐渐增大,并逐次比较i指向的元素和目标元素的大小,若p(i)>T则交换位置。 直到i,j指向同一个值,循环结束。 下面是源码 #include <stdio...原创 2020-05-13 15:46:24 · 493 阅读 · 0 评论 -
数据结构之链表
为了避免插入和删除的线性开销,我们需要允许表可以不连续存储,否则表的部分或全部需要整体移动。 链表由一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该表后续元素的结构的指针。我们称之为NEXT指针,最后一个next指针指向NULL。 指针变量是包含存储另外某个数据地址的变量。因此,如果P被声明为指向一个结构的指针,那么存储在P中的值就被解释为主存中的一个位置,在该位置能够找到...原创 2019-04-26 12:36:58 · 397 阅读 · 0 评论 -
算法分析
算法是为求解一个问题需要遵循的、被清楚的指定的简单指令集合。 估计算法资源消耗所需的分析一般来说是一个理论问题,因此需要一套正式的系统架构。 定义:如果存在正常数c和使得当N时,T(N)cf(N),则记为T(N)=O(f(N))。 定义:如果存在正常数c和使得当N时,T(N)cg(N),则记为T(N)=(g(N))。 定义:T(N)=(h(N)),当且仅当T(N)=O(h(N))且T(N)...原创 2019-04-22 18:00:31 · 398 阅读 · 0 评论 -
最大子序列和的问题的解(1)
最暴力的做法,复杂度O(N^3) 暴力求解也是容易理解的做法,简单来说,我们只要用两层循环枚举起点和终点,这样就尝试了所有的子序列,然后计算每个子序列的和,然后找到其中最大的即可,C语言代码如下: #include <stdio.h> //N是数组长度,num是待计算的数组,放在全局区是因为可以开很大的数组 int N, num[1024]; int main() { ...原创 2019-04-23 16:45:26 · 378 阅读 · 0 评论 -
最大子序列和的接口函数(2)
int MaxSubsequenceSum(const int A[],int N) { int thisSum,MaxSum,i,j,k; MaxSum=0; for(i=1;i<N;i++) { for(j=i;j<N;j++) { thisSum=0; for(k=i;k<j;j++) { thisSum+=A[K]; ...原创 2019-04-24 08:41:28 · 327 阅读 · 0 评论 -
最大子序列和的接口函数(3)
int MaxSubsequenceSum(const int A[],int N) { int thisSum=0,MaxSum=0,j; for(j=0;j<N;j++) { thisSum+=A[j]; printf("thisSum %d..A[%d]=%d\n",thisSum,j,A[j]); if(thisSum>MaxSum) { ...原创 2019-04-24 09:08:22 · 281 阅读 · 0 评论 -
运行时间中的对数
如果一个算法用常数时间(O(1))将问题的大小消减为某一部分的(通常1/2),那么该算法就是O(logN).另一方面,如果使用常数时间只是把问题减少一个常数,那么该算法就是O(N). 对分查找: 给定一个整数X和整数后者已经预先排序并在内存中,求使得的下标i,如果X不在数据中,则返回i=-1.明显的算法是从左到右扫描数据,其运行花费的线性时间。然而,这个算法没有用到该表已经排序的事实,这就使得...原创 2019-04-24 10:36:20 · 492 阅读 · 0 评论 -
数据结构之树
一、二叉树 二叉树是一棵树,其中每个节点都不能有多余两个儿子。 二叉树的一个性质是平均二叉树的深度要比N小的多,分析表明,这个平均深度为O(),对于特殊类型的二叉树,即二叉查找树,其深度的平均值O(logN) 二、二叉查找树 对于树中的每个节点X,它的左子树中所有的关键字值小于X的关键字,而它的右子树中所有的关键字值大于X的关键字值。 三、二叉树的遍历 前序遍历(DLR) 前序遍...原创 2019-05-05 15:39:59 · 349 阅读 · 0 评论