`

海量数据之 统计ip频率top

 
阅读更多

 思路与步骤

先做hashMap(ip,count)统计出现的次数。

遍历hashMap,根据次数为权值插入二叉树。

中序遍历树。

注:

前序(根左右),

中序(左根右),

后序(左右根)

 

节点定义

 

 

package tree;

public class Node {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Node parent;
	Node left;
	Node right;
	long value;
	Object content;

	public Node getLeft() {
		return left;
	}

	public void setLeft(Node left) {
		this.left = left;
	}

	public Node getRight() {
		return right;
	}

	public Node getParent() {
		return parent;
	}

	public void setParent(Node parent) {
		this.parent = parent;
	}

	public void setRight(Node right) {
		this.right = right;
	}

	public long getValue() {
		return value;
	}

	public void setValue(long value) {
		this.value = value;
	}

	public void setContent(Object content) {
		this.content = content;
	}

	public Object getContent() {
		return content;
	}

}

 

 

树的定义

 

 

package tree;

/**
 * 
 * @author xiaofancn@gmail.com
 * 
 * @deprecated 二叉树是左边为权值最大。
 * 
 */

public class BinaryTree {

	CallBack callBack = null;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Node root;

	long size = 0;

	public void addNode(Node node) {

		if (node == null)
			return;

		if (root == null) {
			root = node;
			size++;
			return;
		}

		Node point = root;

		do {
			if (point.value < node.value) {
				if (point.left == null) {
					node.setParent(point);
					point.left = node;
					size++;
					break;
				}
				point = point.left;
			} else {
				if (point.right == null) {
					node.setParent(point);
					point.right = node;
					size++;
					break;
				}
				point = point.right;
			}
		} while (point != null);

	}

	public Node getLeftLast() {
		if (root == null) {
			return null;
		}

		Node point = root;

		while (point.left != null) {
			point = point.left;
		}
		return point;
	}

	public long size() {
		return size;
	}

	public Node getRoot() {
		return root;
	}

	public Node getRightLast() {
		Node point = root;
		while (point.right != null) {
			point = point.right;
		}
		return point;
	}

	public void setCallBack(CallBack callBack) {
		this.callBack = callBack;
	}

	/**
	 * 
	 * 中序遍历
	 * 
	 * @param node
	 */

	public void inItertor(Node node) {
		if (node.getLeft() != null) {
			inItertor(node.getLeft());
		}
		callBack.doThing(node);
		if (node.getRight() != null) {
			inItertor(node.getRight());
		}

	}

	public interface CallBack {
		void doThing(Node node);
	}

}

 

 

测试代码

 

 

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import tree.BinaryTree;
import tree.BinaryTree.CallBack;
import tree.Node;

public class ClientMain {
	static int index = 0;
	static int top = 15;

	public static void main(String[] args) {

		BinaryTree binaryTree = new BinaryTree();
		Map<String, CountIP> map = new HashMap<String, CountIP>();

		for (int i = 0; i < 10000 * 10000; i++) {
			String ip = "192.168." + (int) (Math.random() * 254 + 1) + "."
					+ (int) (Math.random() * 254 + 1);
			if (map.get(ip) == null) {
				CountIP cip = new CountIP();
				cip.setCount(1);
				cip.setIp(ip);
				map.put(ip, cip);
			} else {
				CountIP cip = map.get(ip);
				cip.setCount(cip.getCount() + 1);
				map.put(ip, cip);
			}

		}

		Set<String> set = map.keySet();
		for (String ipkey : set) {
			Node node = new Node();
			node.setValue(map.get(ipkey).getCount());
			node.setContent(map.get(ipkey).getIp());
			binaryTree.addNode(node);
		}

		System.out.println(binaryTree.size());
		Node point = binaryTree.getRoot();

		binaryTree.setCallBack(new CallBack() {
			@Override
			public void doThing(Node node) {
				if (index < top) {
					index++;
					System.out.println(node.getContent() + "===="
							+ node.getValue());
				}
			}
		});

		binaryTree.inItertor(point);
	}

	private static class CountIP {
		String ip;
		long count;

		public long getCount() {
			return count;
		}

		public void setCount(long count) {
			this.count = count;
		}

		public String getIp() {
			return ip;
		}

		public void setIp(String ip) {
			this.ip = ip;
		}
	}

}
分享到:
评论

相关推荐

    十道海量数据处理面试题

    例如,对于访问日志数据提取IP的问题,可以采用哈希(Hash)方法将数据分散到1024个小文件中,每个文件分别统计IP出现频率,最后合并结果找出频率最高的IP。 其次,需要掌握如哈希表、堆(Heap)、trie树等数据结构...

    海量数据面试题整理txt

    在进行数据统计分析时,如何选择合适的数据结构和算法非常重要。 - **Trie树**:适用于需要频繁进行字符串检索和统计的场景。 - **哈希表**:适用于需要快速查询和更新数据的场景。 例如,在需要统计100万条记录中...

    海量数据处理:十道面试题与十个海量数据处理方法总结

    **1、海量日志数据,提取出某日访问百度次数最多的那个IP** - **问题概述**: 给定一天内的海量日志数据,从中找出访问百度次数最多的IP地址。 - **解决方案**: - **初步思路**: 将所有IP地址写入一个大文件,考虑...

    常见的海量数据处理方法

    本文介绍了几种处理海量数据的有效方法,包括分片存储与去重、使用布隆过滤器、MapReduce框架的应用、统计特定字段、TOP-K问题、精确去重以及高效统计等。这些方法不仅有助于优化存储空间和计算资源,还能大大提高...

    十道海量数据处理面试题与十个方法大总结

    一、海量日志数据,提取出某日访问百度次数最多的那个 IP 这是一个典型的 hash 表应用问题,解决方案是使用 hash 表将 IP 直接存入内存,然后进行统计。在实际操作中,可以将大文件映射为多个小文件,然后找出每个...

    10道海量数据处理题目.pdf

    然后,对每个小文件使用哈希映射(如hash_map)统计IP地址出现的频率,找到每个小文件中出现频率最高的IP。最后,对这1000个IP进行比较,找出全局出现次数最多的IP。这种方法采用了分而治之的思想,结合哈希映射和...

    提取出某日访问网站次数最多的那K个IP

    标题 "提取出某日访问网站次数最多的那K个IP" 涉及的是数据分析和数据处理方面的技术,主要目标是从海量的日志数据中找出在特定日期内访问网站频率最高的K个IP地址。在这个过程中,我们可以使用多种编程语言和工具来...

    海量数据处理

    3. **Top-K算法**:用于找到数据集中频率最高的K个元素。这种算法在搜索引擎领域非常常见,用于确定最热门的查询字符串等。 4. **数据压缩**:通过对数据进行压缩减少存储空间的需求。压缩技术可以有效地减少数据的...

    基于MapReduce方法统计服务器日志topk数据.zip

    这个项目名为"TopK-Log-Map-Reduce-master",它揭示了如何利用分布式计算技术处理海量日志数据,找出出现频率最高的前K个元素,这在诸如网站分析、用户行为追踪或异常检测等场景中非常有用。 MapReduce是一种编程...

    十道海量数据处理面试题与十个方法大总结 面试必备

    - 对于每个小文件,使用哈希表统计各个IP的出现频率,并找到频率最大的IP及其频率。 - 最后,在这1000个频率最大的IP中再次筛选出那个出现频率最高的IP。 **2. 统计最热门的10个查询串** **问题描述**:给定一千万...

    面试题目-大数据量海量数据处理.pdf

    这些面试题目聚焦于大数据量和海量数据的处理,涵盖了各种挑战,包括数据过滤、去重、排序、频率统计和热门元素提取。以下是对这些题目的详细解析和相关知识点: 1. **URL共现问题**:这是一个典型的集合交集问题,...

    海量数据算法

    以上案例揭示了在海量数据处理中,哈希映射、分块、归并、排序和统计等技术的综合运用。掌握这些算法和策略对于解决实际的海量数据问题至关重要,特别是在资源有限的情况下,优化数据处理效率和准确性尤为关键。

    海量 数据 处理 面试题 与 方法大总结

    - **背景**:在大数据场景下,需要处理大量的IP地址信息,例如统计不同IP的访问频率等。 - **解决方案**: - 使用 Hash 函数将IP地址映射到较小的内存空间中,利用哈希表(hash map)来存储每个IP及其出现的次数。 ...

    十道海量数据处理面试题(卷).docx

    这些题目覆盖了海量数据处理的关键技术,包括数据结构(如Trie树、Bloom Filter、Bitset)、排序算法(如基数排序、快速排序)、分布式计算框架(如MapReduce)、空间效率优化(如Top-K、布隆过滤器)等。...

Global site tag (gtag.js) - Google Analytics