ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法——查找一个ip地址数组中,出现次数最多的ip

2021-10-16 14:01:36  阅读:172  来源: 互联网

标签:ipArr leaf ++ ip length 算法 查找 let pointer


一道算法题

找出一组ip地址中,出现次数最多的ip,例:
输入
["192.168.12.32", "192.168.0.32", "192.168.12.32"]
输出
"192.168.12.32"

暴力破解法

function filterIp(ipArr) {
    let maxIp = '';
    let maxCount = 0;
    for(let i = 0; i < ipArr.length; i++) {
        let cur = ipArr[i];
        let sum = 0;
        for(let j = 0; j < ipArr.length; j++) {
            if(cur === ipArr[j]){
                sum++;
            }
        }
        if(sum > maxCount) {
            maxCount = sum;
            maxIp = cur;
        }
    }

    return maxIp;
}
console.time()
filterIp(arr)
console.timeEnd()
default: 0.9111328125 ms

哈希表

function filterIp(ipArr) {
    const map = {};
    for(let i = 0; i < ipArr.length; i++) {
        // 如果map中存在当前ip的key值,则表示该ip已经被统计过了。
        if(map[ipArr[i]]){
            continue;
        }

        let cur = ipArr[i];
        let sum = 0;

        // 从 i 开始,i 之前的一定是被统计过了的
        for(let j = i; j < ipArr.length; j++) {
            if(cur === ipArr[j]){
                sum++;
            }
        }
        // 写入map中
        map[cur] = sum;
    }

    let max = 0;
    let maxIp= '';
    for(let key in map){
        if(map[key] > max){
            max = map[key];
            maxIp= key;
        }
    }
    return maxIp;
}
console.time()
filterIp(arr)
console.timeEnd()
default: 0.208740234375 ms

字典树搜索

class Node {
    constructor(data){
        this.data = data;
    }

    data = '';
    count = 1;
    leaf = [];

    addLeaf(leaf) {
        this.leaf.push(leaf);
    }
    findLeaf(data) {
        for(let i = 0; i < this.leaf.length; i++) {
            if(this.leaf[i].data === data){
                return this.leaf[i];
            }
        }
        return null;
    }
    addCount(){
        this.count++;
    }
}

function createIpTree(ipArr){
    // 根节点为空
    let root = new Node('');
    for(let i = 0; i < ipArr.length; i++){
        let pointer = root;
        ipArr[i].split('.').forEach(item => {
            let includesLeaf = pointer.findLeaf(item);
            if(includesLeaf){
                includesLeaf.addCount();
                pointer = includesLeaf;
            } else {
                let node = new Node(item);
                pointer.addLeaf(node);
                pointer = node;
            }
        })
    }

    return root;
}

function depthFirstSearch(pointer) {
    let maxLeaf = pointer.leaf[0];
    for(let i = 0; i < pointer.leaf.length; i++) {
        if(pointer.leaf[i].count > maxLeaf.count){
            maxLeaf = pointer.leaf[i];
        }
    }
    return maxLeaf;
}

function filterIp(ipArr){
    // 创建字典树
    const ipTree = createIpTree(ipArr);

    // 深度优先搜索字典树,找出每个节点 count 最大的叶子,向下寻找
    let pointer = ipTree;
    let strArr = [];
    while(pointer.leaf.length) {
        let maxLeaf = depthFirstSearch(pointer);
        pointer = maxLeaf;
        strArr.push(maxLeaf.data);
    }

    return strArr.join('.');
}
console.time()
filterIp(arr)
console.timeEnd()

tree: 0.26220703125 ms

字典树居然没有哈希表快?????

哈希表我可能用的不太好,我感觉还有优化方法,不过没有深入去想了。

可能还有别的方法,不过我暂时就想到这三个了。

标签:ipArr,leaf,++,ip,length,算法,查找,let,pointer
来源: https://blog.csdn.net/weixin_48003149/article/details/120786905

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有