美文网首页
算法改进项目中生成会议号问题或者类似黑名单问题

算法改进项目中生成会议号问题或者类似黑名单问题

作者: cjlynn | 来源:发表于2022-02-23 11:50 被阅读0次

这次主要是把现实中项目的真实案例拿出来,使用算法改进其中的有缺陷的部分。

项目中功能背景和代码

之前看过同事写了一个生成会议号问题的代码,情况是这样的,会议号有个固定范围比如10位数,随机生成一个号码,这个号码如果已经存在,就再生成,直到生成的号码不存在为止。这里伪代码大概是这样的

boolean flag = false;
do {
  long random = new Random().nextInt(1000000000);
  flag = redis.checkExistsNumber(random);//匹配redis是否存在这个号码
} while(flag)

像这样的代码,while循环多少次才能得到结果。

改进算法:

于是有了下面的改进算法:
算法思路是这样的,假如:
100个数字,其中3,5,23,24,35这些是已经用过的数字,现在随机获取一个数字。
1,2,99,4,98...95 从左往右,碰到一个已经存在的数字的时候,就从末尾取一个数字出来填到这个存在的位置,这样随机数范围1-95,如果随机出3就返回99,这样一次随机就可以得到结果。


    public static void main(String[] args) {

        NumberUtil blacklist = new NumberUtil();
//        int[] arr = new int[]{3,5,23,24,35};
        int[] arr = new int[100000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Random().nextInt(arr.length);
        }
        log.debug("arr={}", arr);
        for (int i = 0; i < 1000; i++) {
            long s = System.currentTimeMillis();
            blacklist.build(1000000000, arr);
            Integer integer = blacklist.genNumber();
            long e = System.currentTimeMillis();
            log.debug("time={}  value={}", e-s, integer);
        }
    }


public class NumberUtil {
        private int max;
        private Map<Integer, Integer> map = new HashMap<>();

        public void build(int n, int[] blacklist) {
            Arrays.sort(blacklist);
            int m = blacklist.length;
            for (int i = 0; i < m && blacklist[i]<n; i++) {
                for (n--; n > blacklist[i]; n--) {
                    if (n==blacklist[m-1]) {
                        m--;
                    } else {
                        map.put(blacklist[i], n);
                        break;
                    }
                }
            }
            max = n;
        }

        public Integer genNumber() {
            Integer random = new Random().nextInt(max);
            log.debug("random={}", random);
            return map.containsKey(random)?map.get(random):random;
        }
    }

相关文章

  • 算法改进项目中生成会议号问题或者类似黑名单问题

    这次主要是把现实中项目的真实案例拿出来,使用算法改进其中的有缺陷的部分。 项目中功能背景和代码 之前看过同事写了一...

  • 使用报事贴提高会议效率

    在做项目复盘,或者当前项目遇到问题时,我们通常去组织一个会议来尝试解决这些问题。开会能否解决这些问题呢?取决于会议...

  • 垃圾回收算法

    标记-清除算法 是最基础的GC算法,其他算法都是基于此算法,并且改进其缺点。 缺点: 效率问题 空间问题:标记清除...

  • 被忽略的Inception meeting

    Agile 中是被忽略的会就是这个启动会议。或者说是定调会议。 会议的目的是定下项目的大方向和基调,以及潜在的问题...

  • Prim求最小生成树

    Prim 算法整体思路 问题1: 如何找出不在集合中的距离集合(最小生成树)最小的点? 问题2: 最小生成树不存在...

  • Swift 学习 第2天 - UICollectionViewC

    cell 中的实现 VC 中的实现 还请大家指出问题,改进改进。 还请大家指出问题,改进改进。

  • binlog2sql实现MySQL误操作的恢复

    对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操...

  • 第八次例会组织会议者复盘

    会议组织者复盘: 亮点1,能够较好的处理角色顶替问题。 改进1, 改进2,

  • L-BFGS算法

    BFGS算法是用来求解最优化问题的,在这个算法中,相对于普通的牛顿迭代法有很大的改进。链接:http://blog...

  • 动态规划

    1、前言 动态规划和分治算法非常类似,都是通过组合子问题的解来求解原问题。分治算法将问题划分为互不相交的子问题,而...

网友评论

      本文标题:算法改进项目中生成会议号问题或者类似黑名单问题

      本文链接:https://www.haomeiwen.com/subject/whnblrtx.html