Mahout-HashMap的进化版FastByIdMap

FastByIdMap是基于散列的,在处理冲突时是线性探测而非分离链接,这样就不必为每一个条目增加一个Map.Entry对象,从而节省内存开销。

下面代码是一个线性探测Map的Demo:

package com.example.mahout;

public class ArrayHashST_Linear_Probing<Key, Val> {
    private int M = 30001;
    private Key[] keys = (Key[]) new Object[M];
    private Val[] vals = (Val[]) new Object[M];

    private int hash(Key key) {
        return (key.hashCode() & 0x7fffffff) % M;
    }

    public void put(Key key, Val val) {
        int i;
        for (i = hash(key); keys[i] != null; i = (i + 1) % M)
            if (keys[i].equals(key))
                break;
        keys[i] = key;
        vals[i] = val;
    }

    public Val get(Key key) {
        int i;
        for (i = hash(key); keys[i] != null; i = (i + 1) % M)
            if (keys[i].equals(key))
                break;
        return vals[i];
    }

    public static void main(String[] args) {

        ArrayHashST_Linear_Probing<String,String> st = new ArrayHashST_Linear_Probing<String, String>();
        st.put("jocularly", "jocularly");
        st.put("seriously", "seriously");
        st.put("listen", "listen");
        st.put("suburban", "suburban");
        st.put("untravelled", "untravelled");
        st.put("considerating", "considerating");
        st.put("browsing","browsing");
        System.out.println(st.get("jocularly"));

    }

}

这个是分离链接的Demo:

package com.example.mahout;

public class ListHashST_Separate_Chaining<Key, Value> {
    private int M = 8191;
    private Node[] st = new Node[M];

    private static class Node {
        Object key;
        Object val;
        Node next;

        Node(Object key, Object val, Node next) {
            this.key = key;
            this.val = val;
            this.next = next;
        }
    }

    private int hash(Key key) {
        return (key.hashCode() & 0x7fffffff) % M;
    }

    public void put(Key key, Value val) {
        int i = hash(key);
        for (Node x = st[i]; x != null; x = x.next) {
            if (key.equals(x.key)) {
                x.val = val;
                return;
            }
        }
        st[i] = new Node(key, val, st[i]);
    }

    public Value get(Key key) {
        int i = hash(key);
        //System.out.println(i);
        for (Node x = st[i]; x != null; x = x.next){
            System.out.println(x.val);
            if (key.equals(x.key))
                return (Value) x.val;

        }

        return null;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListHashST_Separate_Chaining<String, String> st =  new ListHashST_Separate_Chaining<String, String>();
        st.put("jocularly", "jocularly");
        st.put("seriously", "seriously");
        st.put("listen", "listen");
        st.put("suburban", "suburban");
        st.put("untravelled", "untravelled");
        st.put("considerating", "considerating");
        st.put("browsing","browsing");
        st.get("jocularly");
        //System.out.println(st.get("jocularly"));

    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 15:59:26

Mahout-HashMap的进化版FastByIdMap的相关文章

从零开始学Swift之Hello World进化版

上节课,也就是昨晚啦,我们学习到从零开始学Swift之Hello World,那一节只有一句代码,大家会觉得不够过瘾.那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, start 代表变量的名称, "Hello" 代表变量的值. var start = "Hello" var dot = " , " var end = "world!" // let 是什么意思呢? let total = start

分享:进化版动漫更新提醒(微信及软件)

微信版动漫更新提醒,搜索公众平台: 微伍网 1;,然后在里面找动漫更新提醒当你关注的动漫 更新时,微信马上发信息提醒你关注的动漫已更新到哪集 动漫更新提醒pc端: 当你的软件在后台运行的时候,你关注的动漫在网络上有更新的话,马上发信息和音乐给你,提醒你看最新的动漫.提示音乐跟图片都是可以替换的. 欢迎测试使用,qq:645310824 保留一切权利,版权所有--YongHao Hu 分享:进化版动漫更新提醒(微信及软件)

从零開始学Swift之Hello World进化版

上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, start 代表变量的名称. "Hello" 代表变量的值. var start = "Hello" var dot = " , " var end = "world!" // let 是什么意思呢? let total = sta

#DDBMS#冗余docker网络(进化版)

环境准备: vmware中配置四台ubuntu server 14.04(你可以只安装一个系统,使用克隆功能克隆出另外三台ubuntu),配置好SSH 每台机器配置两个网卡,像openstack一样,分Internal和External IP.这里我让eth0(NAT)作为 External,eth1(host-only)作为Internal. 拓扑图如下: 安装OVS: 具体安装教程参考这里:http://www.sdnlab.com/3166.html 附上我的OVS启动脚本: ovs_la

ACM——I Hate It(线段树的进化版)

Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目. 学生ID编号分别从1编到N. 第二行包含N个整数,

进化版雅可比(有点小错误)

#include <iostream>#include <stdio.h>#include <stdlib.h>#include<math.h>using namespace std; int main() {    freopen("in.txt","r",stdin);    int a;    int i,j,s,k=0;    cin>>a;    double x[a]= {0},y[a];   

四则运算进化版设计思想

设计思想: 1.题目避免重复 (1)调用系统时间函数,将生成的运算式存储,将新的运算式与已生成式子做比较,若相同则不输出,不同则输出 2.可定制(数量/打印方式) (1)提示用户输入题目数量,打印方式,从键盘输入 3.(1)是否有乘除法 在输入之前提示用户是否有乘除法,若没有,则只输出加减法 (2)是否有括号 (3)数值范围 由用户设置数值范围,如果输入不合法,提示输入错误,请重新输入,在随机生成数中保证随机数在用户设置的数值范围 (4)加减有无负数 如果没有负数,比较生成的两个数,保证做减法时

for循环终极版本练习提高 究极进化版

X3 * 6528 = 3X * 8256, X为一个数字 填入一个数字 使等式成立. for (var x = 1; x>0&&x<9; x++) { if ((x*10+3)*6528 == (3*10+x)* 8256) { break; } } alert(x); 在页面上输出以下图形               *             ***           *****         *******       ********* 说道这个题就有点头疼了,首

进化版四则运算

import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Label; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.Wind