408王道数据结构强化——算法题(一)

简介: 408王道数据结构强化——算法题

1.注释以及简写

1.1.最大值——INT_MAX,最小值——INT_MIN

①找最小值初始化为MAX_INT(任何值都比它小);找最大值设置为MIN_INT(任何值都比它大)

int D_min = MAX_INT;    //将D_min初始化为int类型的最大值
for (int i = 0; i < n; i++){    //遍历数组找到数组中的最小值
    if (arr[i] < D_min) D_min = arr[i];
}
int D_max = MIN_INT;    //将D_max设置为int类型的最小值

②还有一种思路:初始化时,将arr[0]赋值给D_min

1.2.比大小函数max(a,b) min(a,b)

加注释直接用(与1.1中代码相比较)

int D_min = MAX_INT;    //将D_min初始化为INT类型的最大值
for (int i = 0; i < n; i++) {
    D_min = min(D_min, arr[i]);    //D_min = D_min和arr[i]中的较小值
}

1.3.使用CIN、COUT代替PRINTF、SCANF

cin >> A[0];
cout << A[0];

1.4.i++和++i

i++先对i进行处理,再自增;++i先自增再对i处理

1.5.交换函数swap(a,b)

①直接用,加注释

②原定义中是采用的指针方式,因此交换的是两个地址空间内的内容

if (arr[i] < arr[j]) swap(arr[i],arr[i+1]);    //arr[i] < arr[j]时,交换A[i]和A[i+1]的值
//等价于
if (arr[i] < arr[j]) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

2.复杂度

1.时间上尽可能高效→不管空间

2.时间和空间两方面都尽可能高效(等价于尽可能高效)→时间优先,空间次要

3.空间复杂度为O(1)且时间上尽可能高效→时间优先,限定空间O(1)

4.什么都没说→能做出来就行

5.只考虑递归和循环

①循环:

1f0769a5c27f4d7abdcbab405a7672f8.png5936f03d2974440fbd40232cf98cc227.png

②递归:时间复杂度为递归的层数;时间复杂度为递归的次数

a3dda946e8264b6495068ac8d7b7314b.png

3.数组

3.1.暴力求解

1.枚举:穷尽所有可能→for循环

2.对无序数组排序→快速排序

3.2.优化

1.考虑没有使用到的条件

2.过度使用条件:例如并没有要求排序的条件下却使用排序的方法做

3.考虑别的思路:

①折半算法:

(1)要求:有序(根据当前查找的结果方便下次查找);数组;一个

(2)代码实现:时间复杂度O(logn),空间复杂度O(1)

int Binary_Search(int arr[], int key, int n) {
    int low = 0, high = n - 1, mid;
    while (low <= high) {
        mid = (low + high) / 2;
        if (arr[mid == key) return mid;    //mid指向的元素和key相等,返回mid,即数组下标
        else if (arr[mid] < key) low = mid + 1;    //mid指向的元素比key小,去右半部分
        else high = mid - 1;    //mid指向的元素比key大,去左半部分
    }
    //如果数组中有和key相等的元素,则一定会在while循环中return
    //while循环结束后还没有执行return,则说明数组中没有和key相等的元素,return-1
    return -1;
}

②指针后移:要求:有序(利用有序性,当前指向的元素是各自表中的最小值,在它们中取最小值即是当前表中所有元素的最小值);多个;线性表(可以是数组,也可以是链表

③贪心算法:局部最优

④动态规划:以空间换时间,空间保存状态

4.单链表

1.不能快排,不能折半查找(没有数组随机存取的特性)

2.注意条件:空间复杂度O(1),不可以改变链表结构

3.数据结构定义:

typedef struct LNode{    //单链表
    struct LNode *next;
    int data;
}LNode, *LinkList;
typedef struct LNode{    //双链表
    struct LNode *prior, *next;
    int data;
}LNode, *LinkList;

4.注意是否有头结点

5.暴力解法:①枚举 ②利用数组保存链表元素(注意使用条件)

6.优化方向:

①前后指针:前后指针相差n个距离,同时向后移动,距离不变(查找倒数第k个)

②快慢指针:链表存在回路,走得快的指针会追上走得慢的指针

③头插法:逆置链表(从头结点后的第一个元素取,然后将该元素用头插法插入头结点后)

④数组指针后移

⑤以空间换时间(长度为n的数组)

5.树

1.递归方式实现,不用记忆非递归

2.定义:左右孩子表示法最常用8cb2bb0c0acf44d1b07b7ef8fc8e66b5.png

3.树的遍历

相关文章
|
3月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
91 1
|
3月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
107 0
|
7月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
213 10
 算法系列之数据结构-二叉树
|
7月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
172 3
 算法系列之数据结构-Huffman树
|
7月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
232 22
|
8月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
236 30
|
8月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
367 25
|
8月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
327 23
|
11月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
239 59
|
4月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
76 0
栈区的非法访问导致的死循环(x64)

热门文章

最新文章