1、进制转换
1.1 什么是进制
普通人类都是这么数数字的:0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21……99、100、101……规律:用0~9组成数字,逢“十”进“一”,这是十进制。
再看看计算机底层是怎么数数字的:0、1、10、11、100、101、110、111、1000……规律:用0~1组成数字,逢“二”进“一”,这是二进制。
再计算机中常用的有:二进制、八进制、十进制、十六进制
下面是0~20的二进制八进制十进制十六进制对照表(注意表中十六进制的10如何表示,15如何表示,16如何表示)
| 十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 二进制 | 0 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 10000 | 10001 | 10010 | 10011 | 10100 |
| 八进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 24 |
| 十六进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 |
总结:n进制就是用0~n-1之间的数字来表示整数数字,从低位到高位(从右向左)依次表示:有几个、有几个、有几个、有几个、有几个、……
举例:
- 七进制数1203的含义是有3个,0个,2个,1个
- 十二进制数BA01的含义是1个,0个,10个,11个
1.2进制转换常用方法
1.2.1 表格法二进制转十进制(其他进制转十进制也适用)
画出表格:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
将二进制数填入第二行,如:10011
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 1 |
同列数字相乘后相加(下方为1的数字相加):1+2+16=19
1.2.2 表格法十进制转二进制
画出表格:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
把十进制数字和表格第一行数字依次作比较,小于该数字就在下方写0,否则写1并相减,接着用结果接着比较,如十进制123转转换过程:
123>64,64下方写1,123-64=59
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 |
59>32,32下方写1,59-32=27
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 |
27>16,16下方写1,27-16=11
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 |
11>8,8下方写1,11-8=3
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 |
3<4,4下方写0,小于就不做减法
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 |
3>2,2下方写1,3-2=1
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 1 |
1=1,1下方写1,后边没了
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 1 | 1 |
所以最终结果是1111011
1.2.3 其他进制 → 十进制 按权展开求和
七进制数1203的含义是有3个,0个,2个,1个,所以:3*1+2*7*7+1*7*7*7=444 所以转换为十进制是444
1.2.4 十进制 → 其他进制 短除法(除基取余法):
如十进制4053480转换为13进制: 4053480 ÷ 13 = 311806 余 2
311806 ÷ 13 = 23985 余 1
23985 ÷ 13 = 1845 余 0
1845 ÷ 13 = 141 余 12 (C)
141 ÷ 13 = 10 余 11 (B)
10 ÷ 13 = 0 余 10 (A)
余数倒序排列:ABC012就是结果
1.2.4 二进制 <-> 八进制/十六进制
两句话句话:
- 1位八进制变为3位二进制,3位2进制变为1位8进制
- 1位十六进制变为4位二进制,4位2进制变为1位16进制 如八进制123转二进制:
1->001
2->010
3->011
所以结果是:001010011也就是1010011
相反的二进制10010101转换为八进制,首先从低位开始3个数字一组:101、010、10
10->2
010->2
101->5
所以该数字对应的十进制是225
2、初识数据结构
常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图,它们可以从“逻辑结构”和“物理结构”两个维度进行分类。
2.1.1 什么是逻辑结构?
下图中的几个数据结构主要展示了不同数据结构的逻辑结构,重点是数据集合内元素之间的关系,和操作数据集合的方式
按逻辑结构分类主要分为:
线性结构、非线性结构(树状、网状)
2.1.2 什么是物理结构?
所谓物理结构形容的是数据存储在内存中的位置关系(内存地址关系),下图解释了什么是内存地址。
物理结构主要有两类:连续的、分散的(离散的)
物理结构决定了对数据集合的操作的时间开销(学习数组和链表后回过头来看看这句话)。
2.1.3 关于逻辑结构和物理结构的比喻
- 逻辑结构更像是老板和员工的关系,强调的是逻辑关系,你是员工,逻辑结构关注的是你和老板的上下级关系,你老板站在什么位置对你俩的上下级关系不会产生影响。
- 物理结构更像是排队,强调的是位置关系(内存地址关系),关注的是前后关系。
- 一种数据结构同时拥有特定的物理结构和逻辑结构,比如你在排队时你的老板可能正好站在你前面。
2.1节内容重在理解,如果没看明白建议学完数组和链表后再回头看看2.1节的内容。
2.2 数组(arry)
物理结构:元素在内存中连续存储(线性的),且完成声明后,占用内存空间固定。
逻辑结构:每个元素都有一个索引。
主要操作:初始化、根据下标访问元素、插入元素、删除元素、遍历、查找元素、扩充
优点:①通过下标访问元素的时间复杂度是O(1) ②内存空间完全用于存储数据,内存利用率高
缺点:①删除和插入操作时需要移动大量元素,平均时间复杂度是O(n),n是数组长度②长度不可变,当需要扩充数组时会产生较大的时间和空间开销
2.3 链表(linked list)
学习链表必须认识一个东西叫:指针