java 二維點_用Java實現MVPtree——MVPtree點集內去重以及衍生出來的多維向量Hash問題...

上次完成了MVPtree之后,客戶又提出了MVPtree點集元素重復的問題,希望我將元素去重。

集合去重哪家強?java.util找HashSet!如果不計較元素順序,放進去基本就沒有重復元素了。

只是這樣的話就要重寫equals()和hashCode()函數(方法)。因為equals()默認是比較指針(引用)的,2個不同時間new的元素指針不同,就算內部元素相同也會被判定為不同,一定要重寫。hashCode()更加難搞,如果沒有寫好,hash數組會出現只有少數數組下標占有數據的情況,那樣hash表會退化為鏈表。

一般用在MVPtree的數據都是二維點、三維點,或者多維點數據。由於一個維度的坐標數不可能無限大,可以把向量當做N進制數,N就是維度的坐標數最大可達多少。但是很多點是用浮點數的,double可容納16位小數,整數部分可達10的308次方,如果以最大范圍為基准確定N,要用大數類BigInteger不說,hash值可能會撐爆。所以按照一個維度實際可達范圍確定N。

例如有一個4維點,小數精確到6位,維度范圍是[-400,500],N就可取900*1000(忽略后3位小數的不同),取模前的hash值是hash( (a,b,c,d) ) = hash( (a,b,c) )*900000 + hash(d),hash( (a,b,c) ) = hash( (a,b) )*900000 + hash(c),以此類推。其中hash(a) = a + 400,在點較為分散的時候不容易扎堆。

如果點過於集中,N一定要取大一些,以更好地打散點集。

還要對hash值取模,不然值太大了內存根本找不到合適的地址,訪問失敗。一般這個模數是素數(容易打散數據),比原數組大一點。

-------------------------------我是分割線------------------------------------

代碼地址:https://coding.net/u/funcfans/p/MVPtree-for-Java/git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值