待字闺中之又见Google之星分析

题目来源,待字闺中,原创@陈利人
,欢迎大家继续关注微信公众账号“待字闺中”

原题

给定一批查询日志。数量为n。

当中,有的查询出现了多于n/3次,请在线性时间内,找到全部满足条件的查询。

分析

假设初次遇到这个问题,我们会有什么样的思路呢?

  1. 採用hashmap进行计数,O(n)的空间,O(n)的时间
  2. 进行排序。O(nlogn)
  3. 高速选择算法。这个也能够做到O(n)的时间。

可是,假设面试官进一步限制了能够採用方法的范围:不同意使用上述方法。该怎样处理呢?

我们在之前的面试题目中,遇到过类似的一个问题:那次的查询出现的次数是一半以上。

大家还记得,我们的解法么?道理非常easy。但解法是非常巧妙的,当我们每次去掉两个不同样的查询,那终于剩下的查询。就是我们要找的查询——这个查询的出现次数,占了一半以上。

那假设是多于n/3次呢?更一般的情况下。假设是多于n/m次呢?道理全然一样的:我们每次去掉m个不同的查询。那终于剩下的查询,就是我们要找的备选的。道理非常easy,但是要怎样实现呢?之前的题目,是比較简单就行实现每次去掉两个不同的查询的,更一般的情况下,怎样每次去掉m个不同的元素呢?

以下我们会介绍一种实现方法,核心的原理就是:每次去掉m个不同的查询。

第一个方法。是非常有趣的一个方法。相信可以给大家以启示。

一种有趣的实现

有一个经典的游戏。叫做俄罗斯方块。

想必非常多同学都玩过的吧,俄罗斯方块,有不同颜色、不同形状的方块,从上往下落,假设砌满一行,这一行就会消失。一般列数都是固定的,在玩儿的过程中不会变化。这里要讲的一个实现,就是从俄罗斯方块这个游戏启示而来的。

我们申请一个大小为m的map,開始遍历查询日志,假设:

  1. 遇到一个不在map中的查询,则插入map中。而且将值设置为1(相当于新落下一个方块)
  2. 遇到一个在map中的查询。则将map中,该查询相应的值加1(相当于在已有的方块上又多加了一个)

当map中的查询个数等于m时,则对map中全部查询的值减一(相当于砌满了一层,就会消掉)。直到遍历完成查询日志。map中还存在的查询。就是我们要找的查询的备选。我们看以下的详细的样例:

查询日志为:4 3 3 2 1 2 3 4 4 7 且m=5

上述方法的过程例如以下:

当 4 3 3 落入到map中的时候,map的形状例如以下:

  3
4 3

当 2 1 2 3 落入到map中的时候,map形状例如以下:

  3    
  3   2
4 3 1 2

当 4 4 落入到map中的时候。map的形状例如以下:

4 3    
4 3   2
4 3 1 2

当 7 落入到map中的时候。map形状例如以下:

4 3      
4 3   2  
4 3 1 2 7

此时。map的大小=5,能够消除一行了。

消除之后例如以下图:

4 3      
4 3   2  

此时剩下三个查询,但不都是满足条件的查询,须要逐个验证。O(n)就可以。

分析上述方法的空间复杂度为O(m).当m=3时,就能够觉得是常数空间。那么时间复杂度呢?切要看map是怎样实现的,假设是基于树的,整个的时间复杂度O(nlogm),m=3时,能够觉得是O(n)的。

代码例如以下:

void deleteOneLevel(map<int,int>& hashMap)//删除一层,就是每次删除m个元素
{
	map<int,int>::iterator iter1 = hashMap.begin(),iter2;
	while(iter1 != hashMap.end())
	{
		(iter1->second)--;
		iter2 = iter1++;
		if(iter2->second == 0)
		{
			hashMap.erase(iter2->first);
		}
	}
}
bool check(vector<int>& data,int value,int length,int m)//检查hash表中剩余的元素是否符合要求
{
	int count = 0,i;
	for(i=0;i<length;i++)
	{
		if(data[i] == value)count++;
		if(count * m > length)return true;
	}
	return false;
}
vector<int> googleStar(vector<int>& data,int m)
{
	int length = data.size(),i,j;
	vector<int> res;
	map<int,int> hashMap;
	for(i=0;i<length;i++)
	{
		hashMap[data[i]] ++;
		if(hashMap.size() == m)//hash表中有m种元素时,把每种元素减一,删除仅仅出现一次的元素
		{
			deleteOneLevel(hashMap);
		}
	}
	map<int,int>::iterator iter = hashMap.begin();
	while(iter != hashMap.end())
	{
		if(check(data,iter->first,length,m))res.push_back(iter->first);
		iter ++;
	}
	return res;
}
时间: 2024-08-06 23:59:26

待字闺中之又见Google之星分析的相关文章

Google Analytics谷歌分析教程:代码添加

一般用户注册添加过程 如果您是第一次知道Google Analytics(分析),并想把Google Analytics(分析)添加到您的网站上,那么您只需要以下几步 第一步:创建 Google Analytics(分析)帐户 要创建 Google Analytics(分析)帐户,请按以下步骤操作: 1.访问 http://www.google.cn/analytics/zh-CN/. 2.输入您 Google 帐户的电子邮件和密码,然后点击登录.如果没有 Google 帐户,请点击立即注册创建

Zookeeper和 Google Chubby对比分析

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt375 随着云计算的推广,云平台的设计和实现越来越复杂,很多系统属性如一致性和可靠性往往是在系统迭代开发时才被考虑到.如果在原生的系统上重复的实现复杂的一致性算法,这样不仅会破坏原有设计的结构,而且还带来很多开发上的负担.因此很多系统开发人员和架构师努力地进行系统划分,将系统分割成很多组件,分层设计,模块调用,从而最大限度地提高软件复用能力,降低系统设计和开发的难度. Goo

Google示例SlidingTabsColors分析

/* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.a

网站分析(Google Analytics)学习资料

Google Analytics(分析): https://www.google.com/analytics/web? ? Google Analytics(分析)帮助: https://support.google.com/analytics#? ? 蓝鲸的网站分析笔记: http://bluewhale.cc? ? 知乎:深入学习 Google Analytics: http://www.zhihu.com/question/19599402?

Google高级技巧—google Hack★★★★

google hacking事实上并算不上什么新东西,当时并没有重视这样的技术,觉得webshell什么的,并无太大实际用途.google hacking事实上并非如此简单... 经常使用的googlekeyword: foo1 foo2 (也就是关联,比方搜索xx公司 xx美女) operator:foo filetype:123 类型 site:foo.com 相对直接看网站更有意思,能够得到很多意外的信息 intext:foo intitle: fooltitle 标题哦 allinurl

如何使用GOOGLE高级搜索技巧

原文出处: 新浪博客(未找到原始出处) 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于1999年创立.2000年7月份,Google替代Inktomi成为Yahoo公司的搜索引擎,同年9月份,Google成为中国网易公司的搜索引擎.98年至今,GOOGLE已经获得30多项业界大奖. 二,GOOGLE特色 GOOGLE支持多达132种语言,包括简体中

Android系统Google Maps开发实例浅析

Google Map(谷歌地图)是Google公司提供的电子地图服务.包括了三种视图:矢量地图.卫星图片.地形地图.对于Android系统来说,可以利用Google提供的地图服务来开发自己的一些应用.Google Map的服务体现在两个方面:地图API和位置API.使用Android Maps API(地图API)和Android Location API(定位API)可以轻松实现实用而且强大的功能. 我的位置:“我的位置”在地图上显示你的当前位置(通常在 1000 米范围之内).即使没有 GP

Hadoop源代码分析

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.html GFS:http://labs.google.com/papers/gfs.html BigTable:http://labs.googl

android开发步步为营之70:android接入Google Analytics总结

求人不如求己,今天项目里要接入Google Analytics,这个是做应用统计分析用的,可以查看当前手机活跃用户,事件点击等等数据,先看看效果: 之前eclipse里面接入已经成功,昨天项目组决定项目转成使用android studio来开发,看google官方文档,官方文档https://developers.google.com/analytics/devguides/collection/android/v4/,然后官方文档里面的配置文件是用google-services.json的,这