由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 用bst怎么实现hashtable?
相关主题
问一个G公司的题问个java hashcode的题
hashtable在c++里怎么实现?问一道题
二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?Amazon电话二面
请教个面试题, tree和hashmap的区别常见的一个电面题
几道关于数据结构的面试题。问个常见算法题的变形
发个高盛onsite的面经问个常见算法题的变形
5分钟前G的电面弱弱的问问intersection, union of two arrays or two sets ?
求教一道面试题找二叉树 两个最大的相同子树
相关话题的讨论汇总
话题: hashtable话题: bst话题: hash话题: xxx话题: hashcode
进入JobHunting版参与讨论
1 (共1页)
c********p
发帖数: 1969
1
一点头绪都没有。。。
z****e
发帖数: 54598
2
编hashcode
按照hashcode塞入bst
遇到相同的hashcode还要额外实现equals
不过一般这种时候,对equals不会有太高的效率要求
直接线性对比就好了
c********p
发帖数: 1969
3
hashcode就比如用长度来编,那之后equal了要怎么办啊?
有什么可行操作没?

【在 z****e 的大作中提到】
: 编hashcode
: 按照hashcode塞入bst
: 遇到相同的hashcode还要额外实现equals
: 不过一般这种时候,对equals不会有太高的效率要求
: 直接线性对比就好了

z****e
发帖数: 54598
4
hashcode用平常常用的那个方法来编
如果equals的话,直接替换
如果遇到hashcode相同的,你要固定放到某一边去
比如大于的放右边,小于和等于就都放左边
其实就是用hashcode来当bst的index

【在 c********p 的大作中提到】
: hashcode就比如用长度来编,那之后equal了要怎么办啊?
: 有什么可行操作没?

c********p
发帖数: 1969
5
哦哦是这样啊。。。
刚才看你回复,我在想,是不是也建个linked list,然后每个node是一个linked list
,重复的就放在里边呢。。。
搜一个点的时间复杂度,近似是logN ?

【在 z****e 的大作中提到】
: hashcode用平常常用的那个方法来编
: 如果equals的话,直接替换
: 如果遇到hashcode相同的,你要固定放到某一边去
: 比如大于的放右边,小于和等于就都放左边
: 其实就是用hashcode来当bst的index

z****e
发帖数: 54598
6
那样就复杂了
你把hashcode相同的情况放到tree里面比较好
其实复杂度是一样的,反正都是挨个比过去

list

【在 c********p 的大作中提到】
: 哦哦是这样啊。。。
: 刚才看你回复,我在想,是不是也建个linked list,然后每个node是一个linked list
: ,重复的就放在里边呢。。。
: 搜一个点的时间复杂度,近似是logN ?

c********p
发帖数: 1969
7
嗯嗯,你的方法更好。

【在 z****e 的大作中提到】
: 那样就复杂了
: 你把hashcode相同的情况放到tree里面比较好
: 其实复杂度是一样的,反正都是挨个比过去
:
: list

s*******n
发帖数: 305
8
LZ准备写几个methods呀, 可以讨论下? 我也正准备写这个。 其实我感觉这个更像是
写个2叉树, 而不是hashtable.
二叉树
isRoot(xxx);
insert(xxx);
remove(xxx);
size(xxx);
inorder(xxx);
hashtable
put(xxx)
get(xxx)
remove(xxx)
size(xxx)
containkey(xxx)
iterator(xxx)
c********p
发帖数: 1969
9
我不写,我看看思路就好啊。

【在 s*******n 的大作中提到】
: LZ准备写几个methods呀, 可以讨论下? 我也正准备写这个。 其实我感觉这个更像是
: 写个2叉树, 而不是hashtable.
: 二叉树
: isRoot(xxx);
: insert(xxx);
: remove(xxx);
: size(xxx);
: inorder(xxx);
: hashtable
: put(xxx)

c********p
发帖数: 1969
10
本来就是二叉树啊。。。。。

【在 s*******n 的大作中提到】
: LZ准备写几个methods呀, 可以讨论下? 我也正准备写这个。 其实我感觉这个更像是
: 写个2叉树, 而不是hashtable.
: 二叉树
: isRoot(xxx);
: insert(xxx);
: remove(xxx);
: size(xxx);
: inorder(xxx);
: hashtable
: put(xxx)

相关主题
发个高盛onsite的面经问个java hashcode的题
5分钟前G的电面问一道题
求教一道面试题Amazon电话二面
进入JobHunting版参与讨论
c********p
发帖数: 1969
11
对了,你这个tree的root怎么选择?
bst的root,不是一般是中点么?
可是你并不知道一共会有多大啊?

【在 z****e 的大作中提到】
: hashcode用平常常用的那个方法来编
: 如果equals的话,直接替换
: 如果遇到hashcode相同的,你要固定放到某一边去
: 比如大于的放右边,小于和等于就都放左边
: 其实就是用hashcode来当bst的index

x*********w
发帖数: 533
12

Lazy .....

【在 c********p 的大作中提到】
: 我不写,我看看思路就好啊。
c********p
发帖数: 1969
13
是你换个马甲到处咬我么?

【在 x*********w 的大作中提到】
:
: Lazy .....

r*********n
发帖数: 4553
14
What is the point of implementing hashtable in terms of bst?
When you generate hash value, you lose all order statistics. Then you insert
the hash value into a bst. Although the hash values are ordered, but it has
nothing to do with the ordering of the original values.
c********p
发帖数: 1969
15
查找快啊。。。
比放到数组里快。

insert
has

【在 r*********n 的大作中提到】
: What is the point of implementing hashtable in terms of bst?
: When you generate hash value, you lose all order statistics. Then you insert
: the hash value into a bst. Although the hash values are ordered, but it has
: nothing to do with the ordering of the original values.

c********p
发帖数: 1969
16
哈哈哈好像把你和另一位搞混了。。。
知道你是谁了。。。

【在 x*********w 的大作中提到】
:
: Lazy .....

x*********w
发帖数: 533
17

@__@ ...

【在 c********p 的大作中提到】
: 哈哈哈好像把你和另一位搞混了。。。
: 知道你是谁了。。。

r*********n
发帖数: 4553
18
为什么会比放到数组里面还要快
比如一个基于open addressing的hashtable,可以让数组很大,hash collision的概率
很小,这样基本上是O(1)查找。
如果你放到bst里面去,至少是O(logN)的时间

【在 c********p 的大作中提到】
: 查找快啊。。。
: 比放到数组里快。
:
: insert
: has

c********p
发帖数: 1969
19
My bad...说错了。。。
问问楼上的吧。。。

【在 r*********n 的大作中提到】
: 为什么会比放到数组里面还要快
: 比如一个基于open addressing的hashtable,可以让数组很大,hash collision的概率
: 很小,这样基本上是O(1)查找。
: 如果你放到bst里面去,至少是O(logN)的时间

q********c
发帖数: 1774
20
这就是一找抽题,如果谁问我这种题,我只能说他/她是白痴,连基本的hashtable怎么
工作的都不懂。
相关主题
常见的一个电面题弱弱的问问intersection, union of two arrays or two sets ?
问个常见算法题的变形找二叉树 两个最大的相同子树
问个常见算法题的变形Amazon first phone interview
进入JobHunting版参与讨论
q********c
发帖数: 1774
21
插入bst要 log(n),为什么不直接插入数组O(1)?先搞清楚hashtable vs bst,再解题,
这种答案,直接就fail了。

【在 z****e 的大作中提到】
: 编hashcode
: 按照hashcode塞入bst
: 遇到相同的hashcode还要额外实现equals
: 不过一般这种时候,对equals不会有太高的效率要求
: 直接线性对比就好了

s********r
发帖数: 403
22
从上下文来看,很可能是
把bst 挂在 hash 的 bucket 上,取代 linklist。

【在 r*********n 的大作中提到】
: 为什么会比放到数组里面还要快
: 比如一个基于open addressing的hashtable,可以让数组很大,hash collision的概率
: 很小,这样基本上是O(1)查找。
: 如果你放到bst里面去,至少是O(logN)的时间

f*******b
发帖数: 520
23
MARK
s******c
发帖数: 99
24
我认为你说的很靠谱

【在 s********r 的大作中提到】
: 从上下文来看,很可能是
: 把bst 挂在 hash 的 bucket 上,取代 linklist。

z****e
发帖数: 54598
25
bst不需要额外的内存,hashtable会浪费一点内存
做一点trade off不是很正常的么
又不是什么都是以时间复杂度为第一优先
c++程序猿不天天就在计算内存的使用么? 
看到另外一个贴,我想起来
hashtable的iterator本身无意义
如果你想根据hashcode 顺序 或者其他序输出结果的话
那显然是tree好用

【在 q********c 的大作中提到】
: 插入bst要 log(n),为什么不直接插入数组O(1)?先搞清楚hashtable vs bst,再解题,
: 这种答案,直接就fail了。

z****e
发帖数: 54598
26
不过要真计较起理由来的话
那tree的确用得不多,在现实环境中
大多数时候用map就是hashmap
我反正是没怎么用过treemap
而且扯到tree很有可能要上递归
这两个都是不怎么用的算法
所以说算法在某种意义上就是回字的那多余的三种写法
用来对付面试用的
不要说tree了,就是hashtable
现在也基本上被淘汰了
还有vector,只有在一些老的代码里面才会看到
这主要是实现时候在多线程环境里面做得太死
不够灵活,后期大面积被其他类所取代
c********p
发帖数: 1969
27
你去抽cc150的主编吧。。。

【在 q********c 的大作中提到】
: 这就是一找抽题,如果谁问我这种题,我只能说他/她是白痴,连基本的hashtable怎么
: 工作的都不懂。

r*********n
发帖数: 4553
28
原来这才是面官的意图。
但是如果每个bucket真的很大了,成为bottleneck,要吗增加bucket数量,要吗用
second-level hashtable。

【在 s********r 的大作中提到】
: 从上下文来看,很可能是
: 把bst 挂在 hash 的 bucket 上,取代 linklist。

c********p
发帖数: 1969
29
解释一下呗?
是说一个hashcode对应很多元素,这样搜的时候要在linkedlist里挨个遍历。。。用
bst就快了,对么?

【在 r*********n 的大作中提到】
: 原来这才是面官的意图。
: 但是如果每个bucket真的很大了,成为bottleneck,要吗增加bucket数量,要吗用
: second-level hashtable。

s*******n
发帖数: 305
30

的确, 我也是在,CC 150 5th edition, Chapter 1, 的内容看到提了3个基本知识题
, 所以开始写的。。。
1. hashtable (array+list)
2. hashtable (bst)
3. StringBuffer

【在 c********p 的大作中提到】
: 你去抽cc150的主编吧。。。
相关主题
Bloomberg intern面经hashtable在c++里怎么实现?
Java的hashcode和equal函数有什么用?二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?
问一个G公司的题请教个面试题, tree和hashmap的区别
进入JobHunting版参与讨论
s*******n
发帖数: 305
31

可以这么说, 每个bucket挂一个bst的话, 是O(logn), linked list是O(n).
要是从这个角度理解的话, 那么查找的最坏情况就可能是O(n), 如果插入的N个数据都
是hash collsion 的话
所以用二叉树除了 time space trade off, 这种情况最坏也就是O(logn)

【在 c********p 的大作中提到】
: 解释一下呗?
: 是说一个hashcode对应很多元素,这样搜的时候要在linkedlist里挨个遍历。。。用
: bst就快了,对么?

z****e
发帖数: 54598
32
其实就是不同数据结构之间的转换
等于是练习基本功
tree要转换成其他数据结构的话,是比较好的选择
各种序的遍历都很容易
hashtable相比之下就难得多
不过hashtable这种结构本身就是一个做到极致的产物
一般也不会要求去转换成其他数据结构

【在 s*******n 的大作中提到】
:
: 可以这么说, 每个bucket挂一个bst的话, 是O(logn), linked list是O(n).
: 要是从这个角度理解的话, 那么查找的最坏情况就可能是O(n), 如果插入的N个数据都
: 是hash collsion 的话
: 所以用二叉树除了 time space trade off, 这种情况最坏也就是O(logn)

c********p
发帖数: 1969
33
不是说每个bucket挂一个bst吧?而是说整个的是一个bst?

【在 s*******n 的大作中提到】
:
: 可以这么说, 每个bucket挂一个bst的话, 是O(logn), linked list是O(n).
: 要是从这个角度理解的话, 那么查找的最坏情况就可能是O(n), 如果插入的N个数据都
: 是hash collsion 的话
: 所以用二叉树除了 time space trade off, 这种情况最坏也就是O(logn)

s*******n
发帖数: 305
34

恩, 所以准备就把BST一写, hashtable不管了。
老了, 记性不好了, 只能练习基本功了。

【在 z****e 的大作中提到】
: 其实就是不同数据结构之间的转换
: 等于是练习基本功
: tree要转换成其他数据结构的话,是比较好的选择
: 各种序的遍历都很容易
: hashtable相比之下就难得多
: 不过hashtable这种结构本身就是一个做到极致的产物
: 一般也不会要求去转换成其他数据结构

c********p
发帖数: 1969
35
没看懂,你说的这啥意思?

【在 s*******n 的大作中提到】
:
: 恩, 所以准备就把BST一写, hashtable不管了。
: 老了, 记性不好了, 只能练习基本功了。

r*********n
发帖数: 4553
36
你每个bucket可以再挂一个小的hashtable,对于所有hash collision的元素重新hash
一遍(用不同的hash function), 然后2nd-level hashtable的每个bucket用数组,不
要用linked list,因为数组能存到cpu cache里面去,比linked list快很多。所以最
后的结果还是O(1)。
另外用bst,每个node有left, right children pointer,其实根本不省内存
memory average search hit
Balanced BST 64N 1.39lgN
Hashtable 32N~128N <2.5
cited from pp. 487 <> by Sedgewick

【在 c********p 的大作中提到】
: 解释一下呗?
: 是说一个hashcode对应很多元素,这样搜的时候要在linkedlist里挨个遍历。。。用
: bst就快了,对么?

s*******n
发帖数: 305
37

不是课后题, 而是在讲hastable和stringbuffer的知识是有提的

【在 c********p 的大作中提到】
: 没看懂,你说的这啥意思?
s*******n
发帖数: 305
38

hash

【在 r*********n 的大作中提到】
: 你每个bucket可以再挂一个小的hashtable,对于所有hash collision的元素重新hash
: 一遍(用不同的hash function), 然后2nd-level hashtable的每个bucket用数组,不
: 要用linked list,因为数组能存到cpu cache里面去,比linked list快很多。所以最
: 后的结果还是O(1)。
: 另外用bst,每个node有left, right children pointer,其实根本不省内存
: memory average search hit
: Balanced BST 64N 1.39lgN
: Hashtable 32N~128N <2.5
: cited from pp. 487 <> by Sedgewick

1 (共1页)
进入JobHunting版参与讨论
相关主题
找二叉树 两个最大的相同子树几道关于数据结构的面试题。
Amazon first phone interview发个高盛onsite的面经
Bloomberg intern面经5分钟前G的电面
Java的hashcode和equal函数有什么用?求教一道面试题
问一个G公司的题问个java hashcode的题
hashtable在c++里怎么实现?问一道题
二叉树如何判断一个节点是不是在另外两个节点的path上。。。。好像是个老题了。。求解?Amazon电话二面
请教个面试题, tree和hashmap的区别常见的一个电面题
相关话题的讨论汇总
话题: hashtable话题: bst话题: hash话题: xxx话题: hashcode