上次完成了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

用Java实现MVPtree——MVPtree点集内去重以及衍生出来的多维向量Hash问题的更多相关文章

  1. Java HashSet对txt文本内容去重(统计小说用过的字或字数)

    Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...

  2. dnspod-sr内网轻量级DNS首选方案 - 运维生存时间

    dnspod-sr内网轻量级DNS首选方案 - 运维生存时间 undefined

  3. 内网技巧-通过SAM数据库获得本地用户hash的方法

    内网技巧-通过SAM数据库获得本地用户hash的方法 在windows上的C:\Windows\System32\config目录保存着当前用户的密码hash.我们可以使用相关手段获取该hash. 提 ...

  4. 用Java实现MVPtree——MVPtree核心算法代码的搭建

    项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写 ...

  5. Java解惑之TreeSet是如何去重的

    引言: 最近在处理一个问题,大致是这个样子,从数据库里面取出一个集合,取出来的数据放到一个JavaBean里面.结果得到的集合长度为1. TreeSetSet的一个实现,默认实现排序:故TreeSet ...

  6. Java中5种List的去重方法及它们的效率对比,你用对了吗?

    01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序)     *     * @param list     * */    public static  ...

  7. java web 学习笔记 jsp内置对象

    jsp2 表达式语言的内置对象 使用方式${object.attributename} 或者${object["attributename"]} pageContext pageS ...

  8. JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月

    1.Java 的内存模型 定义了 happens-before,如果同一个线程中,字节码的先后顺序,后者观测了前者的运行结果,那么就会按顺序执行. Java 线程之间的通信由 Java 内存模型控制. ...

  9. 最新最全的Java面试题整理(内附答案)

    Java基础知识篇 面向对象和面向过程的区别 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发, ...

随机推荐

  1. Py中reshape中的-1表示什么【转载】

    转自:https://blog.csdn.net/weixin_39449570/article/details/78619196 1.新数组的shape属性应该要与原来数组的一致,即新数组元素数量与 ...

  2. NeuroNER+brat工具学习

    1.Brat:http://brat.nlplab.org/ 能够进行直觉标注.命名实体识别.关系标注.分块.共存标注.二元关系标注等(药物与药物).时间标注. 但是这个安装好麻烦啊... 2.

  3. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(七)RTP音视频传输解析层之H264传输格式

    一.H264传输封包格式的2个概念 (1)组包模式(Packetization Modes) RFC3984中定义了3种组包模式:单NALU模式(Single Nal Unit Mode).非交错模式 ...

  4. gem安装出错了

    1.首先是SSL出错. SSL 证书错误 正常情况下,你是不会遇到 SSL 证书错误的,除非你的 Ruby 安装方式不正确. 如果遇到 SSL 证书问题,你又无法解决,请修改 ~/.gemrc 文件, ...

  5. log4j.properties配置详解与实例-全部测试通过[转]

    最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累.这里把网上收集到的整理了一下,并且全部都在机器上测试成功了.这么好的文档估计没有了吧? # ...

  6. linux编写脚本检测本机链接指定IP段是否畅通

    linux编写脚本检测本机链接指定IP段是否畅通,通过ping命令检测指定IP,检测命令执行结果,若为0表示畅通,若为1表示不通,以此判断网络是否畅通,但是指定机器禁用ping命令除外.代码如下: # ...

  7. VS2010和选中代码相同的代码的颜色设置,修改高亮颜色

    使用Visual Studio 2010, 发现很难看清非活动的选中代码,研究了下,发现以下方法可以设置: 1. 菜单:工具  -> 选项  ->环境  ->字体和颜色 2. 在右边 ...

  8. activity bj draw 流程图

  9. sqlserver备份还原数据库时报占用错误

    .做项目时遇到这种情形:原来的test_dev数据库,想复制出test_ft供测试用.此时备份test_dev出test_backup文件,想直接还原成test_ft时会报占用错误. 还原数据库:Th ...

  10. linux系统状态检测命令

    1.ifconfig命令 ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”. 使用ifconfig命令来查看本机当前的网卡配置与网络状态等信息时 ...