- 博客(22)
- 收藏
- 关注
原创 LLVM优化:循环展开
循环分析是一个重要的过程,其目的是识别程序中的循环结构,并对这些循环进行深入分析。这有助于后续的优化,例如循环展开、循环合并、归纳变量提取等。:找出程序中的所有循环,尤其是自然循环。:找出程序中的反向边,这是循环结构的关键标志。:找出在循环体内随迭代变化的变量。:分析和建立循环之间的父子关系。:计算循环中每个基本块的循环深度,以识别循环的嵌套关系。自然循环是指包含一个入口基本块(头部)和至少一个出口基本块,并且通过反向边连接的循环。
2024-12-22 17:15:35
1393
原创 LLVM优化:稀疏条件常量
数据流分析是一种简单强大的程序分析方法,传统上,数据流分析是在输入程序的控制流图(CFG)表示上进行的。图中的节点表示操作,边表示程序执行的潜在流动。程序的属性信息沿着控制流边在节点间传播,直到计算得出的信息稳定下来。稀疏条件常量传播使用的控制流图不同,该方法将输入程序表示为SSA图:图中的节点仍然表示操作,但边表示数据依赖而非控制流。这种表示仅允许在数据依赖的图节点之间选择性地传播程序属性。与以前一样,当与图节点相关联的信息稳定时,处理停止。形式上,数据流问题可以通过一个来描述。
2024-12-22 16:41:20
788
原创 LLVM优化:激进的死代码删除
b9 是一个不可达的基本块,对于基本块 b3 以及其两个目的基本块 b4 和 b5,假设 b3 条件始终为 true 且 b4 为 true 所对应的条件转移目的基本块,在这种情况下,b5 将不会被执行到,b5 中所对应的操作为不可达操作。无用操作是指其结果没有外部可见效应,比如冗余的变量赋值操作,该变量在定义后没有在后续的操作中使用到,不会对后续操作产生任何影响,所以可以直接删除该变量赋值操作。当一个操作位于不可达基本块中,根据不可达基本块的定义,该操作将不可能被执行到,所以该操作为不可达操作。
2024-12-22 16:35:41
1182
原创 LLVM优化:Mem2Reg
名字是用来标识具体实体的重要手段。这本书的关键思想是:为不同的实体赋予唯一的名字,可以减少不确定性和模糊性。一个程序被称为处于 SSA 形式,当且仅当程序中的每个变量在程序文本中恰好只被赋值一次。一个重要的性质是 引用透明性,也就是说,在程序文本中,由于每个变量只有唯一的定义,变量的值与它在程序中的位置无关。在SSA中,每个变量的定义点和使用点通过定义-使用链(def-use links)隐式连接。数据流信息只在定义点和使用点之间传播,不会浪费计算资源分析无关的程序点。SSA并不阻止在程序执行期间对同一个变
2024-12-22 16:34:36
954
原创 左程云算法通关026 哈希表 有序表 堆 比较器
C++中的哈希表用的是unordered_map<类型1,类型2>map;它对于增删改查的复杂度都是O(1),我们来看看哈希表的常见操作:除了unordered_map之外,我们还有unordered_set,set存储唯一元素,比如元素去重,快速查找集合成员。set的方法和map是一样的。
2024-11-04 11:19:30
650
原创 左程云算法通关024 随机选择算法
我们利用改写快排方法:我们假设一个数组,要求第52大的数字,那么荷兰国旗问题划分之后我们看中间等于部分,下标有没有命中52,如果有,就说明我们随机选择的这个数字就是第52的数。算法导论第九章,还有一个BFPTR算法,不用随机选择一个数的方式,时间复杂度也能到O(n),额外空间复杂度O(logn),这个算法很冷门,知道有即可。要求:时间复杂度O(n)最坏情况:要求第0大的数字,但是每次我都选择了第100大,第99大...这样就是O(n^2)。利用改写快排的方法,时间复杂度O(n),额外空间复杂度O(1)。
2024-02-21 07:00:00
379
原创 王道数据结构第八章 排序
稳定性:序列中出现两个相同关键字时,排序前后二者的相对顺序并没有改变。排序算法的分类:插入排序、交换排序、选择排序、归并排序、基数排序。插入排序分为直接插入排序,折半插入排序,希尔排序。选择排序:简单选择排序、堆排序。交换排序:冒泡排序、快速排序。归并排序:二路归并排序、外部排序。基数排序:最特殊的一种,适用于链表。注意:下面所说的排序序列,均是非递减排序(非递减不一定等于递增,因为可能出现两个相同的)
2023-12-26 00:00:00
1709
1
原创 左程云算法通关004 冒泡选择插入排序
冒泡排序:0到i位置上,相邻位置较大的数向后走,最终最大值达到i位置,之后重复0到i-1.选择排序:从i到n-1位置上每次找到最小值并放在i位置,之后从i+1到n-1继续。插入排序:0到i位置已经有序,新来的数找到自己的位置插入,之后继续。建议:会的同学直接跳过。
2023-12-22 00:00:00
413
原创 王道数据结构第七章 查找
顺序查找意思就是从头到尾(反之亦然)挨个查找,适合于顺序表、链表,表中元素有序无序都无所谓。顺序查找的实现:老师讲的是不带哨兵版,书上是带哨兵版。带哨兵版本: 有哨兵存在只是不用判定数组是否越界,但对实际运行效率而言并没有多快。 查找效率分析我们看ASL,并且分查找成功和失败两种情况去讨论。查找成功:ASL=(1+2+3+...+n)/n=(n+1)/2;查找失败:ASL=n+1;无论成功还是失败,数量级都是O(n)。接下来我们看是否可以优化:如果一个顺序表是有序的,表中数据元素要么递增要么递减
2023-12-13 22:59:09
1201
1
原创 王道数据结构第六章: 图论及其应用
图这一章比较难,算法也很多,考试一般只会考察大家对算法的理解,算法的具体实现反而不是重点。学习图这一章时,注意要和树对比着学习。图和树很多地方是相似的,我们还会学到最小生成树等概念。
2023-10-26 22:52:49
488
原创 王道数据结构第四章 串
串,即字符串string,是由0个或多个字符组成的有限序列。一般记为S='asdf......'其中S是串名,单括号括起来的是串的值,字符个数n称为串的长度,n=0时称为空串。子串:串中任意个连续的字符组成的子序列。主串:包含子串的串。字符在主串当中的位置:字符在串中的序号。编号从1开始,和线性表的位序是一样的。子串在主串中的位置:子串的第一个字符在主串当中的序号。串其实就是一种线性表,数据元素必须是字符型。串的基本操作,如增删改查等通常以子串为操作对象。
2023-09-26 19:42:45
277
原创 王道数据结构第二章 线性表
线性表是具有相同数据类型的n(n>=0)个元素的有限序列,其中n为表长,当n=0时,线性表是一个空表。若用L命名线性表,则其一般表示为ai是线性表中第“i"个元素在线性表中的次序。a1是表头元素,an是表尾元素。位序从1开始,数组下标从0开始。除第一个元素之外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。由于数据类型相同,所以数据元素所占空间一样大,我们可以方便找到每一个数据元素位置。顺序表:用顺序存储的方式实现线性表把。
2023-09-17 15:38:26
213
1
原创 代码随想录第24天:回溯理论(01)
所有的回溯法都可以理解为一个树形结构,回溯就是一个递归的过程,递归一定是有终止条件的。回溯法说到底是在一个集合中寻找子集,集合的大小构成树的宽度,递归的深度构成树的深度,递归有终止条件,所以一定是一棵N叉树。我们可以发现,当起始位置之后的元素个数不满足我们需要的元素个数,那我们就可以删除,修改起始位置来控制循环次数。在本题中,for循环里i是起始位置,我们就可以令i=n-(k-path.size())+1;回溯是一种搜索的方式,是递归的副产品,有递归必然会产生回溯。对比一下回溯法三部曲的格式,是不是很像?
2023-07-24 23:11:01
175
原创 王道数据结构第五章:树与二叉树
二叉树是指n(n>=0)个结点的有限集合。1)或者为空二叉树,即n=0;2)或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别 是一棵二叉树。特点:二叉树每个结点最多只有两棵子树,左右子树顺序不能颠倒(二叉树是有序树二叉树的五个状态:空二叉树 只有左子树 只有右子树 只有根节点 左右子树都有。
2023-07-22 22:58:50
665
1
原创 代码随想录第四天 链表(02)
fast指针一次走两步,slow指针一次走一步,fast指针先进入环,其后fast和slow相互追赶,二者相对速度为1,在环中肯定能相遇。fast指针路程:x+y+n(y+z);所以我们在相遇点再定义一个指针,头节点定义一个指针,二者同时移动,每次一个单位,相遇 点就是环的入口。这里面的数学逻辑就深奥了,图片我不放出来,可以看上面连接的代码随想录,卡哥的动画还是很直观的。给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
2023-07-20 20:02:34
133
原创 代码随想录第三天 链表(01)
4.addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。对链表的操作核心是对指针的操作,我们没必要重写一个链表,最好就在原链表基础上操作。是头节点的删除,我们要单独操作头节点,为了统一代码,我们采用虚拟头节点的方式。今天正式进入链表这一章,链表我自学一直卡壳在创建链表上,自己写代码一定要把链表创建过程也写出来。我们对链表中的元素操作,一定是对它的前一个元素操作,这样才知道next指针。
2023-07-18 09:03:33
182
1
原创 代码随想录第二天 数组(02)
我们举个例子,假设target=11,而数组是1,1,1,1,11;做题的时候自己能分析出来时间复杂度就可以了,至于leetcode上执行用时,大概看一下就行,只要达到最优的时间复杂度就可以了,一样的代码多提交几次可能就击败百分之百了.....(卡哥说的这句话很好玩)思路2:双指针移动法,和昨天的习题类似,由于数组自身是有序的,所以最大值一定在两端取到,中间一定是最小值。既然一个for循环解决,我们就要思考,指针是指向初始位置还是终止位置,如果是初始位置,那就和暴力枚举没有区别了,所以我们是终止位置。
2023-06-29 23:28:17
106
1
原创 代码随想录第一天 数组(01)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。在重新设置边界时,if(a[middle]>target)重新更改右边界,right=middle-1;此处要+1,左端点是闭区间。以左闭右闭为例,若有等号,left=right,区间中只有一个元素,合法,所以比较时应该有等号。
2023-06-28 10:27:14
613
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅