我试图解决这个家庭作业问题:
您正在为国家安全局(NSA)工作。的网站 NSA受到攻击,你会获得一份清单 大号 可疑的IP地址 从中记录了可疑活动。但是,这些IP广告 - 连衣裙不是真正的地址,而是由恶意攻击者使用 一些匿名软件,隐藏真实的IP地址并制作 看起来可疑活动源于一些虚假的IP广告 - 礼服。匿名软件由专家亲开发 语法并且即使在程序中也可以创建不同的伪造IP地址 从同一IP地址多次使用。 你聪明的同事已经开发了一个 C 功能
SAME_REAL_IP(地址1,地址2)
当两个假地址返回true时 地址 1和 地址 2是 从相同的真实IP地址生成,否则为false。假设 请该函数需要一段时间来计算 设计一个 Ø ( ñ 日志 ñ )算法,如果返回true > 一半的地址 在 大号 是从相同的真实IP地址生成的。你必须争论为什么 你的算法运行在 Ø ( ñ 日志 ñ )以获得充分的信誉。
这是我写的算法:
algorithm(list L){
int halfLength = L.length()/2;
int lengthCounter = 0;
for(int i = 0; i < L.length()-1; i++){
if(SAME_REAL_IP(i, i+1))
lengthCounter += 1;
}
if(lengthCounter > halfLength)
return true;
return false;
}
现在,问题是我的for循环比较列表中的每个元素,如下所示:
SAME_REAL_IP(0,1)
SAME_REAL_IP(1,2)
SAME_REAL_IP(2,3)
SAME_REAL_IP(3,4)
...
但它永远不会检查像SAME_REAL_IP(2,7);
这样的东西虽然我可以使用嵌套for循环执行此操作,但它只能在O(n ^ 2)中运行,我需要它在O(n log n)中运行
所以我的问题是,如何在更快的时间内相互检查每个元素?