算法4-5:关联对数组的接口

关联数组可以有两种操作:

  • 插入一个关键字和对应的值
  • 通过关键字查询与之对应的值

典型的应用有DNS查找。

接口

关联数组的接口如下:

public interface ST<Key,Value> {
    public Value get(Key key);
    public void remove(Key key);
    public boolean contains(Key key);
    public boolean isEmpty();
    public int size();
    public Iterable<Key> keys();
}

接口有以下规则:

  • 键值对中的数值不能为空
  • get()方法返回null表示key不存在
  • put()方法会覆盖现有的值

数据类型

Value的数据类型可以是任意的,但是Key的数据类型必须满足下列条件:

  • Key必须实现Comparable,也就是说可以比较
  • Key必须可以通过equals()函数进行比较
  • 最好使用不可变的数据类型作为关键字的数据类型。

等价测试

equals函数必须满足以下性质:

  • 反射性:x.equals(x)必须为true
  • 对称性:x.equals(y)和y.equals(x)是等价的
  • 传递性:x.equals(y) y.equals(z) 推出 x,equals(z)
  • 非空:x.equals(null)必须为false

等价必须满足以下条件:

  • 对象不是null
  • 对象的类型完全相同,继承的类型也不行
  • 关键的成员变量必须相同

代码模板

public final class Date implements Comparable<Data> {
    private final int month;
    private final int day;
    private final int year;

    public boolean equals(Object y) {
        if(y == this) return true;

        if(y == null) return false;

        if(y.getClass() != this.getClass()) return false;

        Date that = (Date) y;
        ...
    }
}

注意this的判断,null的判断,类型的判断。

算法4-5:关联对数组的接口

时间: 2024-11-20 15:29:31

算法4-5:关联对数组的接口的相关文章

JavaScript--数组--关联(hash)数组

关联(hash)数组的原理: hash算法: 接收一个字符串,计算出一个尽量不重复的序号 不同的字符串,计算出的序号尽量不同 相同的字符串,计算出的序号一定是相同 存入数据时: 将自定义下标名称交给hash算法,计算出一个尽量不重复的序号.将要保存的数据,存入序号对应的位置. 获取数据时: 将要查找的下标名称交给hash算法,再计算出和存入时一模一样的序号,直接去数组指定位置获取元素内容. 优点: 查找速度极快,与数据量和存储位置无关!

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i

基础典型算法研究:合并有序数组

做leetcode第二题的时候,发现合并有序数组是一个很有意思的问题,于是,总结如下,部分内容来源于网络各位大神. 第一种方法: 合并调用sort. 即是将两个数组合并在一个数组里面,然后对合并后的数组调用sort函数即可. class Solution: def getArray(self, A, B) : for item in B : A.append(item) A.sort() 第二种方法: 极值插入法. #include <stdio.h> void insert(int *arr

针对范围对的高效查找算法设计(不准用数组)

题目链接在:针对一群范围对的最快查找算法设计(不要用数组),是我目前遇到的一个较棘手的问题. 描述如下: 假如有一群范围对,格式为:<范围表示,该范围对应的结果值>,设计一个最快查找算法,使得给定一个值,输出该值所在范围对的结果值. 注意:范围对之间没有交集,即不可能存在<1, 10>和<2, 11>这样的两个范围对. 例如有以下几个范围对: <<1, 2>, 20> <<3, 37>, 27> <<48, 5

【算法与数据结构】图 -- 数组表示法

图的数组表示法 借助一个二维数组表示图,该二维数组的第i行,第j列的值表示从Node[i]到Node[j]: 无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称. 有向图(网):是否有弧 / 权值. //图的数组表示法 //最大顶点个数 const int MAX_VERTEX = 100; //最大值 const int MAX_VALUE = (1 << 31) - 1; typedef struct _tagArcCel

1152: 零起点学算法59——找出一个数组中出现次数最多的那个元素

1152: 零起点学算法59--找出一个数组中出现次数最多的那个元素 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 990  Accepted: 532[Submit][Status][Web Board] Description 找出一个数组中出现次数最多的那个元素 Input 第一行输入一个整数n(不大于20) 第二行输入n个整数 多组数据 Output 找出n个整数中出现次数最多的那个整数(

我的算法学习(一)----数组的全排列

看见别人写出来美丽有用的代码,最终下定决心好好学习算法,在这里记录下自己学习的成果. 前两天看到数组的全排列,于是自己照着别人的想法实现了一下,感觉自己理解了,有点小高兴,记载一下. /* * 数组的全排列*/ public class myAllSort { public static void sort(int[] number,int start,int end){ int temp; // 假设发现数组对掉元素到了最后一个,那么就输出,证明已经符合要求 if(start==end) {

前端与算法 leetcode 26. 删除排序数组中的重复项

目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数组中的重复项 概要 一提到原地删除数组,就能立即想到双指针法,这道题本身也没什么难度,日常水题, 提示 双指针 解析 没有思路的时候,耐心一点即可 算法 /** ?*[email protected]?{number[]}?nums ?*[email protected]?{number} ?*/