学习笔记:
1.栈的认识:先入后出,常见的栈场景如函数A调用函数B,函数B调用函数C...递归,递归时要注意防止栈溢出
2.javascript中方法和函数的区别:方法是和某一个对象实例有联系的,(如果这个方法在函数里,那对象就是this)
3.队列的认识:先进先出,只允许在前端删除,后端添加元素
4.优先级队列
5.javascript的数组相当于python的列表
5.数组:根据下标值访问数据方便,但扩容、插入、删除性能消耗大,而链表:扩容、插入、删除方便,取数据麻烦因为是线性查询,就算要取的数据下标是5,也会从0一直遍历到5才取出来
链表的本质:链表的每个元素=存储元素本身的节点+指向下一个的引用/指针(参考下图),链表的增删其实就是next指针的变化,而数组的增删需要数据的位移,如在index=2位置增加一个数据,那index>2的数据都要后移1位,因此性能消耗比链表的增删操作大
6.return语句的使用最主要的一点是,不管一个函数、if判断..里有多少个return,只要记住一旦执行了return语句,那么该return语句后的所有语句都不执行都失效了都直接跳出去了
7.集合:唯一、无序,集合不是数组,不能直接.length求出长度,也不能通过下标index获取元素(数组:有序、可重复)
8.关于P50对var values=this.values()的个人理解,union方法要被实例对象所调用(函数和方法的区别,方法一定是跟实例对象绑定一起的),所以当方法被调用时,调用它的那个就是this,所以这里的var values=this.values()没毛病,虽然看起来有点怪
9.字典:存储的是键值对,无序,key唯一(数组、集合存储的是一个个值)
10.数组的特点:基于index查找效率高,但是插入、删除、修改、和基于内容查找效率就很低,基于内容查找的时候要从头遍历到尾判断内容是否为想要的,才查找得到,(数组、链表的查找都是线性查找,效率低)为了让数组的效率更高点,有了哈希表,哈希表:无序、key不允许重复,哈希表的原理:基于数组,对数值进行哈希函数的变换变成hashcode后来作为它的下标值,存储到数组里,
解决进行hash变换后下标值相同的情况:链地址法、开放地址法,链地址法(数组里的每个元素,存放的不是单个数据,而是一个链表或数组)、开放地址法(当要插入的数据的位置已经被占了,那就从index+1开始继续找,找到有空的位置插进去,要注意删除某一个元素的时候不能直接把值赋值为null,而是要把值赋值为-1)
开放地址法的探测:线性探测、二次探测、再哈希法,线性探测:会产生聚集(一连串填充),会影响效率,二次探测:对步长优化,再哈希法:
哈希表的数据结构:let hashTable = [ [ [key1,value1],[key2,value2],[key3,value3] ] ,[ ] ,[ ] ](数组里的每个元素还是数组)
哈希表的容量改变:在添加方法里判断是否需要扩容,在删除方法里判断是否要减小容量
else:
1.写10进制转2进制的函数,不能用toString,要使用while(P12)
2.算法题击鼓传花(P17),搞清楚for循环外再嵌套while循环
3.自定义封装一个优先级队列存储,入参为element、priority(P20)
4.while的使用、return的使用、delete的使用、.keys()、.values()的使用、str.charCodeAt(index)
5.将data数据插入在数组里指定position的位置,不能用splice方法,用链表的数据插入思想,无论插入的位置何处都要从头到尾遍历,使用while去判断(P26)
6.求一个集合的size(集合不是数组,不能直接.length求出长度)和所有values、以及两个集合的并集、交集、差集、子集(P47、50、51、52、53)
7.创建数组是在内存里创建的
8.结合优先级队列、哈希表存储数据
9.判断一个数是否为质数(只能被1和自己整除)