数据结构与算法

2021-11-16  本文已影响0人  双囍_小赵

计算机提供的数据单位:变量和数组。
其他的数据结构是对这两种数据的管理;

如果是频繁的增删改查就使用LinkedList不要用ArrayList;
如果没有频繁往指定位置去插入数据,用ArrayList是可以的。

LinkedList:

双链表,变量下标为1的有下标2的地址指向,而2也有1的下标指向。如图: 未命名文件 (2).png
算法的时间与空间:
例:a = 10;  b = 20;

1.空间换时间
      int temp = 0;
      temp = a;
      a = b;
      b = temp;
  新开辟了一块内存区域存储temp变量,没有计算,只是转赋值,空间换了计算的时间;

2.时间换空间
      a = a+b;
      b = a;
      a = a-b;
 指令增多,增加了计算成本,所以会耗时,但是没有多的变量了,所以是时间换空间;
HashMap

底层hash表,key-value做法;
hash冲突不能完全解决

hash中涉及到“&”运算:
在java里面这个是一个‘与’运算符,就是二进制中的 同为1才为1.
比如 x = 6&3;
6 = 0110;
3 = 0011;
x = 0010 = 2;

扩展内容:

左移运算:
在最右边补上n个0
例:6 << 1
转化6为二进制:110
左移一位:1100
左移后补一位,十进制就是 12;
如果是负数左移,负数直接被丢弃,部位0,最终结果将变成0;
右移运算:
正数高位补0,负数高位补1,低位舍弃,右移一位相当于除2,右移n位相当于除以2的n次方
例:11 >> 2
转化为2进制:0000 0000 0000 0000 1011
右移两位:      0000 0000 0000 0000 0010
将右边开始的两位移除,就变成了十进制 2 ;

#####右移负数:
计算机计算数据只会以补码的方式进行计算。
所以需要懂得原码—>反码—>补码之间的转换关系:例 :-10;
-10原码:    1000 1010     // 二进制以8位计算  
-10反码:    1111 0101     //反码就是取相反的,符号位不变
-10补码:    1111 0110     //反码基础上+1
所以-10会输出:    1111 0110;

-10>>2 :                  1111 1101(高位补1)
对比正数:
10>>2:                     0000 0010 (高位补0)

无符号右移:
正数:和右移运算的正数右移是一样的,前面高位补充0;
正数10右移10>>>2:   0000 1010->0000 0010    
负数-10右移-10>>>2:   
原:0000 0000 0000 0000 0000 0000 0000 0000  1010-> 
反:1111   1111  1111  1111 1111  1111  1111  1111  0101 -> 右移两位,高位补0
移:0011   1111  1111  1111 1111  1111  1111  1111  1101

a>>>=b 的意思是:a = a>>>b;

总结:
负数>>和>>>都是高位补充1;
正数都是高位补充0;
只要是负数都要反算一遍,在进行进位;
'>>'比>>>负数多了一步就是在反算后+1;

public class Test {
    public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(10));
        System.out.println(Integer.toBinaryString(-10));

        System.out.println(Integer.toBinaryString(10 >>> 2));
        System.out.println(Integer.toBinaryString(10 >> 2));

        System.out.println(Integer.toBinaryString(-10 >>> 2));
        System.out.println(Integer.toBinaryString(-10 >> 2));

//        打印:
//        1010
//        1111 1111 1111 1111 1111 1111 1111 0110    //-10取反

//        10
//        10

//        0011 1111 1111 1111 1111 1111 1111 1101    //取反之后右移的,高位填充0
//        1111 1111 1111 1111 1111 1111 1111 1101    //取反之后右移的,高位填充1
    } 
}
上一篇 下一篇

猜你喜欢

热点阅读