数据结构和算法(2)
散列表、栈、队列 数据结构和算法(2)散列表 散列表(Hash Table,又称哈希表)是一种高效的数据结构(可以简单的理解为一种高效的数组),用于实现键值对(Key-Value)的存储和快速查找。 查找的平均效率为O(1) 原理 举个简单的例子A = 1B = 2C = 3D = 4 通过将字符串转化为数字串的过程就是散列,用于对照的密码叫做散列函数。既然是函数,一定是通过某种法则。例如BAD会转化为214,通过数字求和的函数我们可以得到哈希值2 + 1 + 4 = 7,通过求积的函数我们可以得到哈希值2 x 1 x 4 = 8。但是散列函数必须满足调用同一字符串时,返回的哈希值相同的条件,否则就会出问题。 定义:将任意大小的键(如字符串、对象等)转换为固定大小的整数值(哈希值) 处理冲突有时候我们会遇到一些问题。在前面散列表的一个键BAD返回的哈希值(乘法散列函数)为8,现在我们想加入DAB,我们会发现返回的哈希值仍然是8,这会造成冲突。 解决散列冲突的方法有两种:开放寻址法(open addressing)和链表法(chaining) 开放寻址法:如果出现了...
数据结构和算法(1)
算法、大O记法 数据结构和算法(1)什么是算法?算法,即解决某个问题的一套流程。例如最简单的一个问题,如何把大象装进冰箱?第一步,打开冰箱;第二步,将大象装进冰箱;第三步,关上冰箱。而这整个的流程,就叫算法。但是每个人都有不同的方法,比如小明在装大象时,把大象切成块,多了一个步骤,现在小明需要四步才能把大象装进去,而之前的方法只需要三步,这就叫做时间复杂度。随着要装的大象越来越多,小明所用的步骤越来越多,即n*3步,在这里我们使用大O记法来描述步骤,即O(3n)。但是在大O记法中,我们忽略常数。所以,小明装大象的时间复杂度为O(n)。在程序设计中,我们会想方设法的优化我们的算法,以此来让程序运行相应得更快,发挥代码的极限性能。因此,学习算法是很有必要的。 大O记法的规则:1、忽略常数2、只关注最高阶的N 排序算法和其效率现在我们要对数组 int arr[5] = {4, 2, 7, 1 ,3}进行排序 冒泡排序123456789101112131415161718192021void BubbleSort(){ for (int i = 0; i < 5 ...
多线程编程
多线程编程(基于C++)目录 什么是多线程 创建线程 线程管理 线程的传参 线程的同步与互斥 什么是多线程首先我们需要了解什么是线程。 线程(Thread)是操作系统能够进行调度的最小单位,它比进程更小,是进程的一个子集。线程是程序执行的最小单位,用于实现并发执行。 多线程指的是一个程序中包含两个或者两个以上的线程,多线程的提出是为提高代码的执行效率,这就好比工厂中的流水线,只有一条称为单线程,有多条流水线就称为多线程。 我这里还有更形象一点的例子。AI生成 线程比喻:餐厅里的服务员 想象你走进一家餐厅,餐厅就像一个程序,而餐厅里的服务员就像线程。 餐厅(进程) 餐厅是整个程序的运行环境,它有自己的资源,比如厨房(内存)、餐具(文件句柄)、服务员(线程)等。 餐厅的资源是有限的,但它可以同时为多个顾客服务。 服务员(线程) 服务员是餐厅里的线程,他们负责完成各种任务,比如点菜、送餐、清理桌子等。 每个服务员可以独立完成任务,但他们共享餐厅的资源(比如厨房和餐具)。 顾客(任务) 餐厅里的顾客代表程序中的任务。每个顾客有不同的需求,比如点不同的菜或者要...
如何学习开源代码?
关于如何学习开源代码?对此我简单的以为学习开源代码就是把代码看懂,但是一旦面对工程量庞大的代码,一下子就没有任何的头绪了,而且并没有任何学长教我们,查AI似乎也不太有效果,我就去请教了下老师。经过一下午的学习,我对开源代码学习又有了一个新的认识。 如何开始?我们用这份开源项目来做个例子(也是我正在看的)对于一份正经的开源项目,一定会有一份完善的README文件。例如,通过这份README文档,我们可以获得以下信息 硬件配置 环境部署 调节参数 环境配置 文件结构通过这些信息,我们可以大概了解整个程序所需要的配置以及它能实现的功能。如果遇到什么陌生的东西(对于我来说例如线程延时、Eigen、Cere…),这个时候我们就要自去通过各种手段去查阅相关资料去了解,这比无脑的去看还是强太多了。 Next首先,我们需要明白什么叫做程序。程序,就是数据结构+算法+逻辑。我认为,如果我们想看懂某个项目的代码,首先就需要明确整个项目的逻辑,也就是整个代码的主程序入口(bash)。只有梳理好整个代码的逻辑,我们才能做到代码在心中杂而不乱。接下来我们来看看代码的文件结构 文件结构123456789...



