定点数表示

定点数表示 数值的表示 根据是否有符号位,数值型数据可以分为带符号数和不带符号数。 根据小数点位置是否固定,数值型数据可以分为小数点位置固定的定点数,和小数点位置不固定的浮点数。对于定点表示,纯整数默认小数点在最右侧,表示范围(0 le |x| le 2^n -1);纯小数小数点默认在符号位后面,表示范围(0 le |x| < 1-2^{-n} )。   定点数的机器码表示 原码 原码的表示方法一般用最高位表示数的正负,其余位表示数的绝对值。 当X为纯小数时:begin{align} &0+X_{真值}=X_{真值}  && 0 le X <1 \ & 1-X_{真值}=1+|X_{真值}|  && -1 < X le 0 end{align} [范围:2^{-n} -1 sim 1-2^{-n} (n+1位数)] X为纯整数时:begin{align} & 0+X_{真值}=X_{真值} qquad  && 0le X < 2^n \ & 2^n+|X| qquad  &&-2^n <X le 0 end{align} [范围:1-2^n sim 2^n – 1 (n+1位数) ] 注意:在原码的表示中0有正负两种形式。   补码 虽然原码表示形式简单易懂,但是原码不易于加减法的运算。故为方便计算机中简单的运算引出补码的概念。通过补码能将减法运算变为加法运算。 补码的规则:正数不变,负数在原码的基础上除符号位外各位置取反末尾加一。 补码的基本定义: 通式([X]_{补}=M+X pmod M) n位纯小数的补码表示:begin{align} & X qquad && 0 le X <1 \ & 2+X qquad && -1 le X < 0 end{align} [范围:-1 sim 1-2^{-n+1}] n位纯整数的补码表示:begin{align} & X qquad && 0le X < 2^{n-1} \& 2^n+X qquad && -2^{n-1} le X < 0 end{align}  … 阅读更多

Tower of Hanoi

Hanoi汉诺塔问题 引入 汉诺塔是我们已经再熟悉不过的东西了,其游戏的规则是有a,b,c三个杆子,同时在a上有n个盘子,我们需要通过移动将所有盘子都移动至c杆,但移动的过程中每次只能移动一个盘子,且大盘子不能在小盘子上。 解析 我们如果需要对这个题编写程序可以采用递归的思想,将这个大问题分解成一步一步的小问题,例如现在所有盘子都在a上,我们可以把最大的盘子上面的n-1个盘子先移动到b这个空盘上,然后将最大的盘子移动到c这个目标杆上,对于剩下的n-1个盘子亦是如此。每次我们先借用辅助盘将最大盘上面的所有盘子移动到辅助盘,然后将最大盘再移动到目标盘,以此分解问题,以此我们可以写出程序的主要函数,如下所示: ➕➕ hanoi.cpp Copy to clipboard 1 2 3 4 5 6 7 8 9 10 11 void hanoi(int n,int a,int b,int c) { if(n==1) { cout<<"a->c"<<endl; } else hanoi(n-1,a,c,b); move(a,b); hanoi(n-1,b,a,c); } 对于上述程序我们来分析一下时间复杂度,其中move函数的时间复杂度可以记为常数,几乎不耗时,故该函数时间复杂度主要由两个递归函数hanoi决定,则(T(n)=2 times T(n-1) +c),按照规律递推下去可知该函数时间复杂度为(O(2^n))。   拓展 我们发现最终如果要实现汉诺塔这个盘子的移动最终需要(2^n)这么多步,而这正好是我们n个位数的二进制数能表示的所有情况,那么我们想象能不能把两者进行联系呢。显然这是可以的,我们首先将二进制数从小到大排好,例如(0000,0001,0010, cdots),然后将这些盘子按照大小从小到大标号,从1开始,并将盘子与二进制的位数关联,标号越小位数越低,例如标号为1的盘子则代表最右边的位数,后我们将二进制数与前一个数比较,若是某位从0变为了1那么就将该位代表的盘子向左移动到最近的可行的柱子,接下来我们将通过三个盘子汉诺塔为例子展示这个思想,如下表: 此用二进制表示汉诺塔移动方式给我们提供了新的思路,此发现实为巧妙,小编第一次了解时大受震撼。

Gale-Shapley算法

Gale-Shapley算法 稳定匹配 给定 n 个医院序列 H 和 n 个学生序列 S。每个医院会对所有学生按照其偏好进行排序。 每个学生同样也会对所有医院按照其偏好进行排序。每个医院 h ∈ H 与学生 s ∈ S 一一配对。如果所有医院与学生都进行了配对,就称其达到完全匹配。配对中的不稳定配对 h ↔ s 即为:        – h 当前配对的对象为 s′,而 h 的偏好是 s > s′。        – s 当前配对的对象为 h′,而 s 的偏好是 h > h′。显然,只有在信息交互的过程才会发现不稳定配对。稳定匹配就是没有不稳定配对的完全匹配。 Gale-Shapley算法 该算法主要解决了事物之间匹配的问题,利用该算法能够求出最佳匹配也就是稳定匹配。现通过一例子来说明。设有一组男生w和一组女生m需要寻找对象,且每个男生和女生都有自己的偏好,且他们各自的偏好如下:[m_1 , w_1 > w_2 >w_3][m_2 , w_1>w_3>w_2][m_3,w_1>w_3>w_2][w_1,m_2>m_1>m_3][w_2,m_1>m_2>m_3][w_3,m_3>m_1>m_2]根据Gale-Shapley算法,我们首先遍历男生w,按照男生的需求的优先级先与女生匹配,若男生先要所选的女生已经被匹配了,那么需要观察女生的喜好,对比已经匹配的男生和想要匹配的男生,选择优者,被淘汰者则按照自己的顺序继续寻找女生匹配。该过程在该例子中可以表现为一下具体执行:[m_1 按照优先级首先与 w_1 匹配,现有配对: m_1 leftrightarrow w_2] [m_2 按照优先级与w_1 匹配,但w_1已有配对,择优选择m_2,m_1重新配对选择w_2,现有配对:m_1 leftrightarrow w_2 , m_2 leftrightarrow w_1] [m_3 按照优先级选择w_1 但w_1已有配对,择优选择m_2,m_3重新配对选择w_3,现有配对:m_1 leftrightarrow w_2,m_2 leftrightarrow w_1,m_3 leftrightarrow w_3]按照算法最后的稳定匹配为[m_1 leftrightarrow w_2,m_2 lef … 阅读更多

数字逻辑基础

数字逻辑基础 1.1 绪论 1.1.1 模拟信号与数字信号 电子电路在接收或者处理电压或电流信号可分为模拟信号和数字信号两类。模拟信号:幅值在上限和下限之间连续,即幅值在上限和下限之间可以取任意实数值的信号。                 模拟信号可以是时间连续信号,也可以是时间离散信号。时间离散信号可以看成是对时间连续模拟信号采样得到的,也称作采样信号。数字信号:幅值的取值是离散的,即幅值被限制在有限个数值之内的信号。                 数字信号可以是时间连续信号,也可以是时间离散信号。数字信号具有保持和突变的特点,即数字信号在一段时间内保持高电平或低电平,而高                   电平和低电平之间的转化是瞬间的。  1.1.4 数字电路的优点 1.数字电路稳定,精度高 模拟电路精度较低,一般只有千分之一,需要数值较精确,例如5.5v和5.8v虽只差0.3v但元件可能工作在不同状态。而如果采用书籍加法器,电压值用二进制数表示,只要增加二进制数的位数就可以提高精度。如32位的数字加法器可以达到(1/2^{32})的精度。 2.数字电路易于设计和测试 3.数字电路可以实现十分复杂的算法 4.数字电路处理的数字信号易于保存 5.数字电路更易小型化和集成化   1.2 数制和码制 1.十进制 任何一个十进制数都可以用位置计数法及加权和的形式来表示[(D)_{10} = (d_{n-1} d_{n-2} cdots d_{1} d_{0} cdot d_{-1} d_{-2} cdots d_{-m} )_{10} = sum_{i=-m}^{n-1} d_i 10^i]式中n表示整数部分的位数;m表示小数部分的位数;(d_i) 是十进制数D的数码,表示(0 sim 9) 这十个数码中的一个;和式中数字10表示十进制的基数,决定了数码的个数;(10^i) 表示处于确定位置的数码(d_i)的权重。例如,十进制数123.45可以按照各数码的权重展开为:[(123.45)_{10} = 1 times 10^2 + 2 times 10^1 + 3 times 10^0 + 3 times 10^1 + 5 times 10^{-2}]十进制数有多种表达方式,例如123可以表示为((123)_{10})、((123)_D)、123D等形式,同样的 … 阅读更多

Manacher(马拉车)算法

Manacher(马拉车)算法 引入 若是某个字符串正着表示和反着表示都是一样的,那么我们可以将这个字符串称作回文字符串。例如abba就是一个回文字符串,而字符串abbbc就不是,因为其反着表示的形式为cbbba与原字符串不同。而在一个字符串中可能存在多个满足回文条件的子串,我们一般取长度最长的称做最长回文子串。如在字符串abacdcabad中存在aba,cdc,acdca等满足回文条件的子串,但是并非最长,其最长回文子串为abacdcaba。那么我们如何求一个字符串中的最长回文子串呢?以下以洛谷P3805题为例  例题解析 题目描述 给出一个只由小写英文字符 a,b,c,…y,z 组成的字符串 S ,求 S 中最长回文串的长度 。字符串长度为 n。 输入格式 一行小写英文字符 a,b,c,⋯,y,z 组成的字符串 S。  输出格式 一个整数表示答案。  输入输出样例 输入:aaa                输出:3   说明/提示 (1 le n le 1.1 times 10^7)      思路分析 思路一(Brute Force): 由题目意思我们不难想到一个最暴力的做法,我们可以以字符串中的每个字符为中点,比较左右两个字符是否相等,然后逐渐扩大半径,直至求出结果,代码如下。 P3805(bf).cpp Copy to clipboard 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <bits/stdc++.h> using namespace std; const int MAXN = 5e5 + 5; void solve() { string s; cin >> s; int maxn = 0; int n = s.length(); for (int i = 0; i < n; i++) { int r = 0; // 以 i 为中心的奇数长度回文串 while (i – r >= 0 && i + r < n) { // 对两侧逐一比较,若是不同则跳出循环,相同则 … 阅读更多