问题列表
python里的list和tuple有什么区别?
- tuple(元组)是不可变列表,
- list的可变性是由于其底层实现机制导致的, 动态数组 + 链表
python里的string释放可以使用for循环修改?
不可以, 它是不可变序列
python里的dictionary和C++的map有什么区别? 其底层实现原理是什么?
- python里的字典通过哈希表实现的
- C++ 的map的实现时通过红黑树实现的
- dict操作复杂度如下:
操作 时间复杂度 copy O(n) get(value) O(1) delete(value) O(1) search(in) O(1) itteratioon O(n)
python的set实现原理
- set与dict类似,但hash函数直接操作它的元素, 而且不包含重复元素
- 实现方式成为Hash set
python的OrderedDict的实现原理
- python中的字典是按照hash来存储的, 因此是无序的
- OrderedDict的实现是 哈希表 + 双向链表
什么是双向队列
它是一种具有队列和栈的性质的数据结构,可以高效的在头尾两端插入和删除元素
什么是优先队列
- 优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出(first in, largest out)的行为特征。
- Python里PriorityQueue是通过heapq实现的,它考虑了线程安全的问题
最大堆、最小堆
- 堆
- 它是一棵完全二叉树或者为空
- 树中节点的值总是不大于或者不小于其孩子节点的值
- 每一个节点的子树也是一个堆
- 最大堆: 除了根节点外的的所有节点都要满足小于等于其父节点的值
- 最小堆: 除了根节点以外的所有节点都要满足大于等于其父节点的值
- Python里是通过list维护堆的性质实现的
python中的深、浅copy
- 浅copy, copy第一层内容,不copy内部对象,下面这个例子可以很好的理解浅copy.
输出结果:lst = ["CV", "NLP", "SPEECH", ["DL, ML, AI"]] lst_copy = lst.copy() print(id(lst), id(lst_copy)) print(id(lst[3]), id(lst_copy[3])) lst.append("Algorithm") print(lst, lst_copy) lst[3].append("Statitics") print(lst, lst_copy)
4584596232 4584596360 4584596104 4584596104 ['CV', 'NLP', 'SPEECH', ['DL, ML, AI'], 'Algorithm'] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI']] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI', 'Statitics'], 'Algorithm'] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI', 'Statitics']]
- 深copy, copy所有内容,生成一个新的完完全全的对象
list可以作为哈希关键字吗
- 一个对象能不能作为字典的key,取决于其有没有__hash__方法, 参考(https://blog.csdn.net/lnotime/article/details/81192207)
- list, dict, set不能作为key
- 数值,字符串,完全不可变的元组,函数,类,方法等可以作为key
C++的多态是什么,如何实现的?
- 多态按字面的意思是多种形态,当类之间存在层次结构并且类之间是通过继承关联时,就会用到多态
- C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数
- 虚函数实现, 在基类中使用关键字virture声明的函数
- 参考链接 C++ 多态
补充知识
-
哈希表
- 关键字 基于关键字直接找到数据的存储位置
- 哈希地址 在查找表中的存储位置
- 哈希函数 通过这个函数可以快速求出该关键字对应数据的哈希地址
- 直接定址法(一次函数)
- 数字分析法
- 平方取中法
- 折叠法
- 除留余数法
- 随机数法
- 解决冲突的方法
- 开放定址法
- 线性探测
- 二次探测
- 伪随机数探测法
- 再哈希法
- 链地址法
- 建立一个公共溢出区
- 开放定址法