@LuVairo

Где ошибка в алгоритме сравнения 2х радиус-векторов?

Структура Vector позволяет инициализировать и сравнивать векторы. Программа проходит все тесты, кроме одного (доступа к нему нет). Может, в сравнении есть какой-нибудь недочёт?
P.s.: парсинг вектора выполнен правильно, вопрос именно о методe CompareTo(...)
using System;

using static System.Math;

internal struct Vector : IComparable<Vector>
{
    public int X { get; private set; }
    public int Y { get; private set; }

    public const double DELTA = 0.0000001;

    public Vector(int x, int y) => (X, Y) = (x, y);

    public double Length => Sqrt(X * X + Y * Y);

    public static Vector Parse(string input)
    {
        var coords = input.Split();

        if (coords.Length < 2)
            throw new ArgumentException("Incorrect vector");

        return new Vector(int.Parse(coords[0]), int.Parse(coords[1]));
    }

    public int CompareTo(Vector other)
    {
        if (Length < other.Length)
            return -1;
        else if (Abs(Length - other.Length) < DELTA)
            return 0;

        return 1;
    }
}
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Если там тест на скорость алгоритма и прогоняют кучу векторов - то у вас тут кромешный ад.
Попробуйте считать не длину а квадратичную длину, и не вычислять ее 4 раза в методе сравнения.
Ответ написан
@ItsSaym
Неясно, в чем заключается ошибка алгоритма, поскольку предоставленный код является действительной реализацией для сравнения двух радиус-векторов. Метод CompareTo использует свойство Length структуры Vector для сравнения величины двух векторов. Если длина текущего вектора меньше длины другого вектора, метод возвращает -1. Если длины двух векторов находятся в пределах небольшой дельты друг от друга, метод возвращает 0. В противном случае метод возвращает 1.

Однако стоит отметить, что структура Vector использует int для координат X и Y, что означает, что она способна представлять векторы только с целочисленными координатами. Если вам нужно представить векторы с нецелочисленными координатами, вы можете вместо этого рассмотреть возможность использования double или float. Кроме того, рекомендуется включать в свой код соответствующую документацию и комментарии, чтобы другим было легче его понять и использовать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы