算法导论示例-HashTable

原创 2006年06月08日 21:20:00
/**
 * Introduction to Algorithms, Second Edition 
 * 11.4  Open addressing tables
 * @author 土豆爸爸
 * 
 */
public class HashTable {
    /**
     * 数据节点
     */
    public static class Node {
        int key;
        
        public Node(int key) {
            this.key = key;
        }
    }
    
    private Node[] table; //直接寻址表
    private Node deleted = new Node(0);
    
    /**
     * 构造函数。
     * @param size 表大小
     */
    public HashTable(int size) {
        table = new Node[size];
    }
    
    /**
     * 根据键值k查找节点。需要跳过标记为deleted的位置
     * @param k 节点的键值
     * @return 键值为k的节点,未找到返回null
     */
    public Node search(int k) {
        for(int i = 0; i < table.length;i++) {
            int j = hash(k, i);
            if(table[j] == null) {
                return null;
            } else if(table[j] != deleted && table[j].key == k) {
                return table[j];
            }
        }
        return null;
    }
    
    /**
     * 插入节点x。根据x.key计算哈希值,如果哈希值对应的位置
     * 已被占据,查找下一个,直到找到一个空位或标记为deleted的位置。 
     * @param x 待插入节点
     */
    public void insert(Node x) {
        for(int i = 0; i < table.length;i++) {
            int j = hash(x.key, i);
            if(table[j] == deleted || table[j] == null) {
                table[j] = x;
                return;
            } 
        }
        throw new RuntimeException("Over flow");
    }
    
    /**
     * 删除节点x。将删除节点标记为deleted。
     * @param x 待删除节点
     */
    public void delete(Node x) {
        for(int i = 0; i < table.length;i++) {
            int j = hash(x.key, i);
            if(table[j] == x) {
                table[j] = deleted;
                break;
            }
        }
    }
    
    /**
     * 计算哈希值
     * @param key 键值
     * @return 哈希值
     */
    private int hash(int key, int i) {
        int m = table.length;
        return (key % m + i) % m;
    }
    
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < table.length; i++) {
            if (table[i] == null) {
                sb.append("null/t");
            } else {
                sb.append(table[i].key).append("/t");
            }
        }
        return sb.toString();
    }
}

import junit.framework.TestCase;

public class HashTableTest extends TestCase {
    public void testLinkedList() {
        HashTable table = new HashTable(100);
        // 插入100个随机节点
        for (int i = 0; i < 100; i++) {
            int key = (int) (Math.random() * 1000);
            if (table.search(key) == null) {
                table.insert(new HashTable.Node(key));
            }
        }

        System.out.println(table);
        // 找到一个节点
        HashTable.Node node = null;
        for (int i = 0; i < 100; i++) {
            node = table.search(i);
            if (node != null) {
                break;
            }
        }
        assertNotNull(node);
        table.delete(node);
        assertEquals(null, table.search(node.key));
    }
}

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

【算法导论】02——渐近符号、递归及解法

渐近符号 1、Θ记号  Θ(g(n)) = { f(n) : 若存在正常数c1,c2和n0,使对所有n>=n0时有0 其效果相当于删除f(n)中的低阶项,并忽略最高阶项的系数。 ...
  • muyimo
  • muyimo
  • 2014年07月27日 22:10
  • 786

算法导论-22.2-7-树的直径

一、题目 树T=(V,E)的直径(diameter)定义为max(u,v),亦即,树的直径是树中所有最短路径长度中的最大值。试写出计算树的直径的有效算法,并分析算法的运行时间。 二、思考 ...

算法导论 堆排序 C语言实现

算法导论 第六章 堆排序

算法导论(c++实现)chapter4

算法导论的第四章——分治策略,主要的算法为寻找最大子数组问题,还有矩阵乘法的Strassen算法,还有一些课后的练习题,主要讲了求解递归式的三种方法:代入法(感觉像是猜测,然后用数学归纳法验证),递归...

堆排序(最小堆)--【算法导论】

堆排序的思想在堆排序(最大堆)已做说明,故不再赘述; 总之,思想就是首先进行建堆,由于这是最小堆,故而必须保证父节点都小于孩子节点,若不满足条件,则进行调节; 最后进行堆排序,不断将最小的提取出来...
  • xjm199
  • xjm199
  • 2014年01月08日 21:39
  • 4036

《算法导论》第12章 二叉搜索树 个人笔记

第12章 二叉搜索树 12.1 定义 12.2 查询 12.3 插入和删除 12.4 随机构建二叉搜索树...
  • Amber07
  • Amber07
  • 2017年05月19日 10:43
  • 99

《算法导论》第四章-第2节_练习(参考答案)

算法导论(第三版)参考答案:练习4.2-1,练习4.2-2,练习4.2-3,练习4.2-4,练习4.2-5,练习4.2-6,练习4.2-7...

算法导论---------动态规划之钢条切割

动态规划方法通常用来求解最优化问题。动态规划算法设计步骤: 1.刻画一个最优解的结构特征。 2.递归定义最优解的值。 3.计算最优解的值,通常采用自底向上的方法。 4.利用计算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-HashTable
举报原因:
原因补充:

(最多只允许输入30个字)