算法图解(1)

2024-09-03 01:36
文章标签 算法 图解

本文主要是介绍算法图解(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

配套代码:

https://github.com/egonSchiele/grokking_algorithms?tab=readme-ov-fileicon-default.png?t=N7T8https://github.com/egonSchiele/grokking_algorithms?tab=readme-ov-file

理论

数据结构:组织和存储数据的方式,影响程序的性能和存储效率

算法:任何具有明确的步骤或规则的代码片段,用于旨在高效、准确地解决特定问题或执行某项任务。

设计模式:帮助开发者结构化和组织代码,提高代码的可维护性、可扩展性和复用性。

二分查找(查找算法)

原理:通过逐步将搜索范围缩小一半,快速定位目标元素的位置。

优点:高效,简单

缺点:通常仅适用于有序数组

时间:O(log n):因为每次查找都是上一次的一半,正好符合2的倍数

空间:

实例:给定排序好的数组,查找值为item的元素,在数组的什么索引位置

template <typename T>
int binary_search(const std::vector<T>& list, const int& item) {int low = 0;int high = list.size() - 1;while (low <= high) {int mid = (low + high) / 2;T guess = list[mid];if (guess == item) {return mid;}if (guess > item) {high = mid - 1;} else {low = mid + 1;}}return -1;
}

对数

幂:一个数被多次相同的数相乘的结果:底数a^指数b,a 自身乘以自身 b 次

对数:幂运算的逆运算:给定一个幂的结果,求底数需要多少次方才能得到这个结果

转换:logb(x) = y -> b^y = x

以 e 为底的对数,记作 ln⁡,  以 10 为底的对数,记作 log

时间复杂度

大O表示法:最坏情况运行时间: O(操作次数):指出了随着元素数量的增加,算法运行时间(并非以秒为单位,而是随着输入规模(通常用 n表示)趋向于无穷大时,算法运行时间的增长趋势)

引用
  1. O(1)常数时间,算法的运行时间不依赖于输入规模
  2. O(log n)对数时间,二分查找等分治算法
  3. O(n)线性时间,归并排序、快速排序
  4. O(n * log n)线性对数时间,速度较快,简单的线性查找或遍历
  5. O(n^2)平方时间,速度较慢,冒泡排序、选择排序。
  6. O(n^3)立方时间:通常是三重嵌套循环
  7. O(2^n)指数时间,暴力解法、某些递归算法
  8. O(n!)速度非常慢,暴力解法(旅行商问题)

空间复杂度

描述了算法在输入规模增加时,所需的存储空间的增长情况。考虑程序运行时占用内存的大小,而不是可执行文件的大小。

  • O(1)常数空间,只使用有限个变量,不额外申请空间
  • O(n)线性空间,需要额外数组或链表来存储输入数据。
  • O(n2)平方空间,需要一个二维数组来存储数据。

复杂表达式化简

  1. 去掉运行时间中的加法常数项 
  2. 去掉常数系数
  3. 只保留保留最高项,去掉数量级小一级的n 

递归与斐波那契数

递归 是指在定义或解决问题时,函数直接或间接地调用自己。递归可以简化代码层面的复杂度,而非时间空间复杂度

递归时间复杂度:递归的次数 * 每次递归中的操作次数。

阶乘:一个正整数的所有小于或等于该数的正整数的乘积

int function2(int x, int n) {if (n == 0) {return 1; }return function2(x, n - 1) * x;
}

斐波那契数:其中每一项是前两项之和,F(0)=0,F(1)=1

int fibonacci(int i) {if(i <= 0) return 0;if(i == 1) return 1;return fibonacci(i-1) + fibonacci(i-2);
}

内存

  • 栈区(Stack) :由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
  • 堆区(Heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS收回
  • 未初始化数据区(Uninitialized Data): 存放未初始化的全局变量和静态变量
  • 初始化数据区(Initialized Data):存放已经初始化的全局变量和静态变量
  • 程序代码区(Text):存放函数体的二进制代码

如何计算内存?根据数据类型占用的字节数

内存对齐:

经过内存对齐后,CPU访问内存的速度大大提升,因为CPU读取内存不是一个一个字节读取的,具体取多少个字节取决于硬件。如果对齐后一次寻址就可以找到数据,提高性能,但同样也会浪费内存资源,

这篇关于算法图解(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131647

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1