一道机试题

那年后台人手不足,需要请个人过来帮忙,但是又不知道水平如何。苦思之下,想了几道机试题让应聘者做做。有一其中有道题目是这样:
给出一系列不重复的字母和对应的权重值(如下所示),就可以根据权重大小,随机抽取到不同的字母。
字母 权重
‘a’ 5
‘b’ 4
‘c’ 4
‘d’ 20
‘e’ 13

根据此场景,完成如下要求
a、计算出每个字母被随机选中的概率。
b、请随机抽取N次,将抽取到的字母以及频率打印出来。
c、能够动态添加【新的的字母和权重】,并重新计算的字母选中的概率。
d、进行扩展,使之支持 【带权重的数字】【带权重的字符】 【带权重的复杂对象】的随机抽取算法

虽然题目很简单,可以检测编码水平。

  • Level1:套着面向对象的皮,但是以过程式的思维完成此功能。
  • Level2:会将重复逻辑抽象出来,进行复用。
  • Level3:发现潜在的联系,对逻辑进行抽象,完成功能。

这是一个优化后的版本

public interface Weightable<Key> {
    /**
     * @return 权重
     */
    public Integer weight();
    /**
     * @return 标识
     */
    public Key key();
}

public class WeightSelect<Key> implements Serializable {
    private Map<Key, Integer> rw = new LinkedHashMap<>();
    private int sum = 0;
    public void addWeight(Key key, Integer value) {
        if (value > 0) {
            sum += value;
            rw.put(key, sum - 1);
        }
    }
    public Key selectKey() {
        int i = ThreadLocalRandom.current().nextInt(sum);
        for (Entry<Key, Integer> e : rw.entrySet()) {
            if (i > e.getValue()) continue;
            if (i <= e.getValue()) return e.getKey();
        }
        return null;
    }
}
public abstract class AbstractWeightSelector<Key, Value extends Weightable<Key>> {
    public Map<Key, Value> entries = new LinkedHashMap<>();
    protected WeightSelect<Key> selector = new WeightSelect<Key>();

    public AbstractWeightSelector() {

    }
    public AbstractWeightSelector(Collection<Value> values) {
        initSelect(values);
    }
    protected void initSelect(Collection<Value> values){
        for (Value v : values) {
            if (v.weight()> 0) {
                this.entries.put(v.key(), v);
                selector.addWeight(v.key(), v.weight());
            }
        }
    }
    public Value select() {
        return entries.get(selector.selectKey());
    }
}

凡是 继承 Weightable接口的对象,都可以进行权重选择。
WeightSelect是随机选择的算法实现。
AbstractWeightSelector是提供给业务的接口抽象,调用方只关心此类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:题中所指的『机器学习』不包括『深度学习』。本篇文章以理论推导为主,不涉及代码实现。 前些日子定下了未来三年左右...
    我偏笑_NSNirvana阅读 40,188评论 12 145
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,944评论 1 10
  • 前言 其实读完斯坦福的这本《互联网大规模数据挖掘》,让我感觉到,什么是人工智能?人工智能就是更高层次的数据挖掘。机...
    我偏笑_NSNirvana阅读 12,787评论 1 23
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 14,116评论 2 64
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,384评论 11 349