互联网公司面试中经常被问的有关问题
互联网公司面试中经常被问的问题
机器学习
- SVM的原理是什么?
- LR的原理是什么?
- RF的优缺点是什么?
- 数据建模的过程是什么?
- 如何评估一个特征的有效性?
大数据
- Mapreduce的原理是什么?
- Mapreduce的二次排序是怎样的?
C++
- 野指针是什么?怎么造成的?
- 虚函数是怎么回事?
算法与数据结构
- 简单叙述一下快速排序的原理。
- 容器类hashmap与hashtable的区别是什么?
C++中的标准模版库(STL)中是没有hashtable的。 C++中的map是通过对数据的键值的比较来进行数据的存放和查找的。所以map是需要提供键值的比较函数的。通常我们使用string类型作为键值类型,是使用了C++提供的缺省的比较函数。如果是另外的自定义的类型作为键值的话,就要自己提供比较函数了。
从数据结构上来说,hash是一种按照某种键值查找和存放一组数据的数据结构和方法策略。它是通过对键值数据提供hash值的算法实现的。一般hash值是一个整型数字。它的效率很大程度上取决于hash值的产生。它的重复率越低,效率就越高。如果没有重复率,那么它的查找效率应该比任何一个算法都高。可惜的是,对于一些应用的情况,很难找到一个好的hash值的算法。
map实际上算不是一种数据结构的名词。它是C++及java语言的一个类的名字罢了。但它同hash查找的应用目标应该是相一致的。都是通过键值找到对应的数据记录。甚至map也可以用hash算法来实现,那么它就是一个hashtable了。
在《STL源码剖析》中SGI版本的STL实现中有讲到hashtable和hashmap。hashtable可以提供任何有名项(named item)的存取操作和删除操作,也可被视为一种字典结构,它通过一个hash函数将剑指(key)映射为一个整数值,这个值对应一个桶子,key所对应的value存储在桶子中。SGI在STL标准规格之外,另提供了一个所谓的hashmap,以hashtable为底层机制。由于hashmap所供应的借口操作,hashtable都有提供,所以几乎所有的hashmap操作行为,都只是转调用hashtable的操作而已。map的特性是每一个元素都同时拥有一个实值(key)和一个键值(value)。这一点在hashmap中也是一样,hashmap的使用方式跟map完全相同。普通的map在底层是用红黑树实现的,因此具有自动排序功能,而hashtable没有这样的功能,因为hashmap底层用hashtable实现,是无序的一种数据结构。
版权声明:本文为博主原创文章,未经博主允许不得转载。