JONY

无符号整数的机器级表示与算术运算(没写完)

无符号整数的机器级表示 计算机是通过二进制位存储和传输数据的。虽然这些二进制位适合表示二进制数,但还是有一定区别,比如寄存器和总线的位数通常是固定的,另外对于负号、小数点、分数等等都不能直接表示,需要规定一些规则计算机才能处理。这些规则中,最简单的就是对无符号整数的表示,无符号整数顾名思义就是没有符号的整数,也就是自然数。这种表示和数学上的表示几乎没有区别,只需要预先规定好占用的位数,并且需要高位补0,比如在4位无符号整数表示下,3要写作0011,而3对应的二进制数是11。 一般的k位无符号整数,能表示的十进制数范围是闭区间的\([0,2^k–1]\)。   无符号整数的加法 之前讨论行波进位加法器时,没有规定如何处理最低位进位输入、最高位进位输出,这里规定为“忽略最高位进位的输出,最低位进位输入始终保持0”。当两个\(k\)位无符号整数码输入到\(k\)位加法器(\(k\)个1位加法器组成的行波进位加法器),若结果未超出\(k\)位,那么加法器的输出就是正确的和。但若超出\(k\)位(两个\(k\)位无符号整数码经过加法器最多只能超出1位),则加法器会忽略掉最高位的进位,剩下的\(k\)位才是最终输出,这种情况称为加法器的溢出,可通过余数描述。在这种规定下,这种\(k\)位加法器就能做\(k\)位无符号整数码的加法,具体这样描述:… 阅读全文

有符号整数的机器级表示与算术运算(没写完)

有符号整数的机器级表示 使用二进制位表示能带负号的有符号整数时,需要额外占用1个位来表示正负。有如下3种公认的表示方案: 1) \(k\)位原码:最高的第\(k\)位表示符号,称为符号位。0表示正数,1表示负数。剩下的位称为数值位,按\(k-1\)位无符号整数的方式表示绝对值。注意在原码下0有两个码,比如在4位下0有0000和1000的2种表示。这时会定义前者为负的-0,后者为正的+0(也就是0分为正数和负数两个)。\(k\)位原码的取值范围是\([ -(2^{k-1}-1), 2^{k-1}-1 ]\); 2) \(k\)位反码:正数(含+0)为其原码,负数(含-0)为其原码“符号位不变,其他位取反”。反码取值范围和原码一样; 3) \(k\)位补码:正数(含+0)为其原码,负数(含-0)为其反码+1。补码中的-0会溢出,比如4位反码1111的原码会溢出,使其变为0000,也就是-0和+0一样,所以补码无需区分-0与+0。这里还有个问题是补码1000的意义不明确,在补码中会直接规定其表示-8。故4位补码的能表示-8~7,其中只有1个补码表示0,一般的\(k\)位补码的取值范围是\([… 阅读全文

定点小数的机器级表示与算术运算(没写完)

定点小数的机器级表示 前面讨论过用无符号整数码和补码表示整数,如果约定这两种码的固定位置有小数点,那这两种码也能表示这种数,称为定点数(定点小数)。这样一来整数就是定点小数的特例,整数可看作是小数点在最低位右边的定点小数。一般来说可以约定小数点在最高位之前(纯小数)到最低位之后(整数)的任意的\(k+1\)个位置上。 定点整数和数学中整数的区别不大,除了不能处理无穷。但定点小数和数学中的小数则有区别,定点小数的取值范围更像“以二进制0.1(\(2^{-1}\))、0.01(\(2^{-2}\))…为步长的整数”。比如1个4位的码1111,将其看作无符号整数码,表示15。将其看作小数点定在第2位之前的无符号小数码,表示\(15\times 2^{-2}\)。虽然计算机不直接存储小数点位置,为方便也可写作11.11。… 阅读全文

浮点数的机器级表示与算术运算(没写完)

浮点数的机器级表示 (1) (2) 前面讨论的都是定点数,其特点是小数点位置静态不可变,且小数点位置本身没有硬件来存储。浮点数则是完全不同的结构,因为每个浮点数必须记录自身小数点的位置,“浮点”这个名字就是是指小数点位置可变。于是设计浮点数的表示方案会更复杂,而且小数的数学性质本身也更复杂一些,比如前面讨论过,小数进制转换天生就有精度丢失问题。 目前权威的浮点数方案是数值专家William Kahan主导的IEEE754,采用科学记数法以\((-1)^s\cdot M \cdot 2^N\)计数,科学记数法中的基数与指数在IEEE754中称为尾数与阶数。在计算机中会从高位到低位存储\(s,N,M\),对\(s,N,M\)的具体规定如下: 1) \(s\):符号位,表示浮点数的符号,规则是0正1负; 2) \(M\):即尾数(指小数的尾数);… 阅读全文

广度优先搜索

广度优先搜索(BFS) 之前所讨论的BFS是种“简化的”版本,而“通用的”BFS将作为其他图算法的框架,所以在通用BFS的执行途中需记录一些信息。算法导论中的BFS需要记录顶点颜色(白/灰/黑=未到达/已到达/已到达且所有邻接顶点已到达)。顶点的\(\pi\)为前驱顶点,\(d\)为前驱顶点的\(d+1\)(源点的\(d\)为0)。在这种定义下顶点入队时从白染灰,出队时从灰染黑。BFS结束后利用顶点的\(\pi\)可得到该BFS下源点与其可达顶点形成的BFS树,树中的顶点为黑色而其他未达的顶点为白色。 def bfs(graph,vertex): visited = [vertex,] queue = [vertex,] while queue: vertex = queue.pop(0) for v in graph.getVertices(vertex):… 阅读全文

深度优先搜索

深度优先搜索(DFS) 通用DFS的用途比通用BFS更广泛,DFS记录顶点颜色、前驱、变灰时间、变黑时间。顶点有三种色(白/灰/黑=未到达/已到达并开始当前顶点的子DFS/已到达且全部邻接顶点的子DFS结束亦即当前顶点的子DFS结束)。时间的定义是每次变色时间加一,其用于描述搜索的推进。顶点由白变灰意味着其子DFS的开始,该DFS会一直持续到该顶点变黑。任意子DFS在结束时比开始只会新增染黑的顶点。DFS往往要求访问完源点所有可达顶点后(此时根据可达顶点的前驱可得DFS树),若顶点集尚有未达顶点,就从中选新源点在“当前时间”继续DFS(最终根据所有顶点的前驱可得DFS森林)。该要求意味在解决很多问题时从任意源点DFS不影响结果,而且往往需访问所有顶点。 def _dfs(graph,vertex,time,attr):… 阅读全文

有向无环图的拓扑排序

AOV网与拓扑排序日常生活中常需要流程化的完成有依赖关系的事(比如“穿鞋前必须穿裤,穿鞋前必须穿袜”)。这类关系适合用有向无环图描述,其中的顶点表示任务,边表示任务之间的依赖关系。这个图之所以“无环”是因为如果存在环会导致任务“循环依赖”,导致环路上的任务无法找到可行的执行次序,即有环时这个图就没有意义。这样的描述任务依赖的有向无环图一般称为AOV网,在AOV网执行拓扑排序的结果是得到由AOV网所有顶点组成的序列,按该序列的次序执行任务不会违反依赖关系。 下面给出拓扑排序的定义“有向无环图上的拓扑排序(Topological Sorting)是将图的所有顶点排成有序序列,对于序列中的任意两顶点,若存在u到v的路径则v必然排在u之后”。 class AOV:def __init__(self): self.d… 阅读全文

无向图的连通性与割点割边

无向图的连通性 1) 无向连通图:若无向图\(G\)上的任意两顶点间都有路径可达,则称\(G\)为无向连通图; 2) 割边(桥):若删去连通无向图\(G\)的边\(e\),则\(G\)不再连通,就称\(e\)是\(G\)的一个桥; 3) 割点:若删去连通无向图\(G\)的顶点\(u\)和以\(u\)为端点的边,则\(G\)不再连通,就称\(u\)是\(G\)的一个割点; 4) 无向的点双连通图:若从无向连通图\(G\)删去任意一个顶点剩下的部分还是无向连通图,即若\(G\)上不存在割点,则称\(G\)是一个无向的点双连通图; 5) 无向的边双连通图:若从无向连通图\(G\)删去任意一个变剩下的部分还是无向连通图,即若\(G\)上不存在割边,则称\(G\)是一个无向的边双连通图; 6) 子图:给定有向/无向图\(G’=(V’,E’),… 阅读全文

有向图的连通性与强连通分量

有向图的连通性 1) 转置图:把有向图所有边逆转方向得到的图; 2) 基图:有向图去掉边的方向后所得到的无向图; 3) 有向弱连通图:若有向图\(G\)的基图是无向连通图,则\(G\)为有向弱连通图; 4) 有向单连通图:若有向图\(G\)的任意两顶点\(u,v\)满足从\(u\)可达\(v\)或从\(v\)可达\(u\),则\(G\)为有向单连通图; 5) 有向强连通图:若有向图\(G\)的任意两顶点\(u,v\)满足从\(u\)可达\(v\)且从\(v\)可达\(u\),则\(G\)为有向单连通图; 6) 强连通分量(SCC):有向图的一个极大的有向强连通子图,SCC最小为1个顶点,最大为整个图; 结合之前讨论的无向图连通性与上述定义,可了解有向图连通性的概念。下面研究SCC以及如何通过算法求出有向图上的全部SCC,这称为把有向图分解为SCC。通常把1个SCC记录为1个顶点集合。… 阅读全文

有根树的最近公共祖先

有根树的最近公共祖先(LCA)若有根树任意两点\(u,v\)都位于\(r\)点代表的子树中,则称\(r\)是\(u,v\)的公共祖先(\(r\)可等于\(u,v\)且\(u,v\)也可相等),LCA是\(u,v\)所有公共祖先中,离\(u,v\)总距离最小的(设所有边的距离为1),给出LCA的几个性质: 1) \(u,v\)的LCA是其所有公共祖先中深度最大的; 证明:设\(r\)是\(u,v\)的一个公共祖先,那么\(u,v\)距离\(r\)的总距离等于\(depth(u)-depth(r)+depth(v)-depth(r)\)。由于\(depth(u),depth(v)\)是固定的,所以\(depth(r)\)越大则说明总距离越小。 2) \(u,v\)的LCA有且仅有1个; 证明:若\(u,v\)有两个LCA,根据(1)其位于树的同层。由树性质,同层2个不同节点分别代表的子树一定无交集,导致矛盾。… 阅读全文
滚动至顶部