В этой статье блога мы углубимся в различные методы решения проблемы поиска K ближайших точек к началу координат в Scala. Мы рассмотрим различные подходы, предоставим примеры кода и обсудим их плюсы и минусы. Итак, приступим!
Метод 1: сортировка по евклидову расстоянию
Первый метод включает в себя вычисление евклидова расстояния каждой точки от начала координат, сортировку точек по их расстоянию и выбор K ближайших точек.
import scala.math.sqrt
def kClosestPoints(points: Array[Array[Int]], k: Int): Array[Array[Int]] = {
val sortedPoints = points.sortBy(p => sqrt(p(0) * p(0) + p(1) * p(1)))
sortedPoints.take(k)
}
Метод 2: приоритетная очередь
Второй метод использует приоритетную очередь для отслеживания K ближайших точек. Он перебирает все точки, поддерживая очередь размером K, и обновляет ее всякий раз, когда находится более близкая точка.
import scala.collection.mutable.PriorityQueue
import scala.math.sqrt
def kClosestPoints(points: Array[Array[Int]], k: Int): Array[Array[Int]] = {
val pq = PriorityQueue.empty(Ordering.by((p: Array[Int]) => -sqrt(p(0) * p(0) + p(1) * p(1))))
for (point <- points) {
pq.enqueue(point)
if (pq.length > k)
pq.dequeue()
}
pq.toArray
}
Метод 3: Разделяй и властвуй
Третий метод использует стратегию «разделяй и властвуй», чтобы найти K ближайших точек. Он рекурсивно делит точки на более мелкие группы и объединяет результаты, чтобы найти последние K ближайших точек.
import scala.math.sqrt
def kClosestPoints(points: Array[Array[Int]], k: Int): Array[Array[Int]] = {
def merge(left: Array[Array[Int]], right: Array[Array[Int]]): Array[Array[Int]] = {
(left ++ right).sortBy(p => sqrt(p(0) * p(0) + p(1) * p(1))).take(k)
}
def divide(points: Array[Array[Int]]): Array[Array[Int]] = {
if (points.length <= k)
points
else {
val mid = points.length / 2
val left = divide(points.take(mid))
val right = divide(points.drop(mid))
merge(left, right)
}
}
divide(points)
}
В этой статье мы рассмотрели три различных метода поиска K ближайших точек к началу координат в Scala. Мы обсудили сортировку на основе евклидова расстояния, использование очереди приоритетов и стратегию «разделяй и властвуй». Каждый метод имеет свои преимущества и недостатки, поэтому выбор зависит от конкретных требований вашего проекта. Не стесняйтесь экспериментировать с этими подходами и выберите тот, который лучше всего соответствует вашим потребностям.