mit linearer Zeitkomplexität ich die „finden Paare, die zu X aufaddieren“ umzusetzen versuchen funktionell mit linearer Zeitkomplexität, für die ich habe folgend:Functional „Find-Paare, die zu X aufaddieren“
def pairs(nums: List[Int], sum: Int): List[(Int, Int)] = {
def pairsR(nums: List[Int], sum: Int, start: Int, end: Int, acc: List[(Int, Int)]): List[(Int, Int)] = {
val newAcc = nums(start) + nums(end) match {
case n if n == sum => ((nums(start), nums(end)) :: acc, start + 1, end - 1)
case n if n < sum => (acc, start + 1, end)
case n if n > sum => (acc, start, end - 1)
}
if(start < end) pairsR(nums, sum, newAcc._2, newAcc._3, newAcc._1)
else newAcc._1
}
pairsR(nums, sum, 0, nums.length - 1, List())
}
Das würde funktionieren, wenn ich versuchen würde, nach dem ersten Paar zu suchen, das zu X addiert (vorausgesetzt, dass ich nach dem ersten Auftreten zurückkomme). Aber weil ich versuche, alle Paare zu finden, erhalte ich einige Duplikate, wie hier zu sehen ist: (Beachten Sie, dass es in der Liste nur eine einzige 5 gibt, aber da die Zeiger zur selben Zeit auf 5 ankommen, rate ich sie zweimal)
pairs(List(1,2,3,4,5,6,7,8,9), 10) should equalTo (List((1, 9), (2, 8), (3, 7), (4, 6)))
Doch bekomme ich folgende Fehler an:
List ((5,5), (4,6), (3,7), (2,8), (1,9)) nicht gleich List ((1,9), (2,8), (3,7), (4,6))
dieser Algorithmus ist einfach nicht möglich zu erreichen, in lineare Zeit, wenn Sie ALLE Paare suchen (und nicht nur die erste)? Ich weiß, dass es mit einem HashSet möglich ist, aber ich wollte wissen, ob Sie den "Zeiger" -Ansatz verwenden könnten. Hier
Das Aufrufen von 'apply' auf einer' Liste' wie 'num (start)' ist eine * O (n) * Operation, also könnte es besser sein, 'Vector' oder gar' Array' in 'pairsR' zu verwenden. –
@PeterNeyens +1 für Vektor. Es ist ein wenig bekannt (zu noobies) factoid, dass Vector das geeignete O (1) für die indizierte Suche ist. * Nicht * Liste – javadba