【发布时间】:2020-05-21 13:03:31
【问题描述】:
我有三个长度为 9 的字符串数组,我想看看它们是否都包含相同的名称。我必须在线性时间 O(NlogN) 内完成此操作。我的计划是对两个数组进行排序,然后使用二进制搜索来查找相似的名称。我的代码是这样的atm:
import edu.princeton.cs.algs4.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class Triplicate2_2_21 {
// arrays.binarysearh
public static void main(String[] args) {
//Strengir sem innihalda 9 nöfn. Sumir innihalda sama nafnið.
//Nöfn sem eru eins í öllum 3 listunum eru Hulda og Ingi.
String[] name1 = {"Helgi", "Arnar", "Hulda", "Hrefna", "Ingi", "Marta",
"Svavar", "Ester", "Valur"};
String[] name2 = {"Oddur", "Birgitta", "Hulda", "Ingi", "Selma", "Svavar",
"Sylvia", "Unnar", "Hrefna"};
String[] name3 = {"Elfa", "Jan", "Hulda", "Hrund", "Ingi", "Marta",
"Angela", "Sturla", "Valur"};
Arrays.sort(name2);
Arrays.sort(name3);
for(int i = 0; i < name1.length; i++) {
if((Arrays.binarySearch(name2,name1[i])).compareTo(Arrays.binarySearch(name3,name1[i])) < 0 ) {
StdOut.println(name1[i]);
break;
}}}}
我只想打印出我找到的第一个三份,这就是我打破的原因。这个代码示例不起作用,我无法弄清楚如何进一步实现这个想法。所以,我在这里寻求你的帮助来完成这个。
附:这是一个家庭作业,问题来自《算法介绍》一书,第 4 版,听起来像这样:
“三次重复。给定三个列表,每个列表有 N 个名称,设计一个线性算法 确定所有三个列表是否有任何共同的名称,如果有,则返回第一个"。
【问题讨论】:
-
要记住的一点是,nlog(n) 严格来说比 3n 慢,所以只进行线性搜索比先排序再进行二进制搜索要快得多。因此,如果您因为这是家庭作业而没有选择这个,请务必在您的帖子中明确说明,并说明您必须做什么以及您自己做了什么。同样正如@RealSkeptic 指出的那样:你确定你被要求实现 nlog(n) 而不是 log(n) 吗?
-
我不确定
compareTo是您需要的。使用您的方法,我可能会选择binarySearch(..) >= 0 && binarySearch(..) >= 0,如果不满足第一个条件,它也会短路。 -
@Mike 你如何在 3N 中搜索所有三个数组都包含任意公共元素?我在幼稚的方法中看到至少 N 平方。
-
这不是我在问题中阅读的内容。他们的描述是“我想看看它们是否都包含相同的名称”,这与“我想看看它们是否至少共享一个元素”不同。因此,如果他们的意思是后者,他们将不得不更新他们的帖子,以更准确地了解他们真正需要做什么。作为第一个描述,第一个列表没有迭代,您只需选择一个元素,然后检查它是否在其他两个中。结果是
true或false,具有线性运行时间。第二个描述产生元素,如果实现天真,则具有二次时间 -
感谢您的回答。我稍微编辑了帖子。我添加了书中的问题,我的意思是它应该是线性的而不是对数的,对不起。
标签: java arrays string algorithm binary-search