“为什么大家都在缅怀某人?不懂,极端严重病态的投机主义者,满嘴跑火车。勇气略可嘉而已。”,“可能是大形势下,跟风有逼格。”,“也有可能是借他这个所谓“符号”来发声而已”。
Homework 6挺绕的,略难,很有趣。
一个一个method记录。
First constructor带一个估计的item总量,然后要产生n/0.5~1.0内的bucket。我选了0.6这个数附近。且bucket数最好是prime number,所以写了个private helper来找prime number。大于n/0.6后的第一个prime number就是我的bucket。
之后记得把所以bucket数的SList也initialize(也就是给remote control分配具体的object)。
Second Constructor的话,直接选101就得了。
compFunction感觉有点迷,也可以说略有技巧。ab这俩数不知道该咋选,code我加了abs,把负转正。N就是bucket数,p是个很有技巧的选择【?】。
因为要求p>>N所以,N的length一定程度上决定了p的length,而且p还必须是prime number。不过幸好自然界有些神奇的prime number,比如233333...往后加多少个3,他都是prime number。所以用N的长度来控制往后加3的个数(String型),最后再将这个String型换成int或Long就好。
Insert这个method,我用了曾经homework 5用的SList,本来想自己在construct一个头尾相连无sentinel的List(方便random select and find),但,不想在自己给自己找事了。
直接找到SList【index】,然后insertback进去就好。注意,insert的是一个entry,entry中包含key和value。key就相当于是词典中的单词,value就相当于是这个单词的definition。
find和remove差不多,这里就着重讲一下find得了。为了能random find,我先随机产生了一个小于等于这个SList length的数,然后用next这个method,walk through到某个node。其实overal就是,随机的选择一个起始node。find的时候,顺着这个起始node next next的找就行。应该还有其他更好的方法,比如,随机一个数n,找到第n个跟这个key一样的node,并返回这个node。
除此之外,还需要特别注意,随机起始node,很有可能随机到很接近tail,这时如果find到tail了,还得back to head。这就是写个头尾相连不要sentinel node的好处。必要考虑这点。
如果遍历这个node上node.length个entry都没有找到的话,别忘跳出循环,否则陷入死循环。
综上所述,感觉,“随机一个数n,从entry 0开始找,找到第n个跟这个key一样的node,并返回这个node”这个方法更好一点啊...
remove和empty都比较简单。
SimpleBoard这个class,想要把3的64次方这个hashcode存储,得需要BigInteger这个Java build-in class来帮助。equal就比较this和board的BigInteger objects一不一样就行。