У меня есть программа C ++, которая ожидает входной файл в формате:
X Y Z
1 1 .642
1.1 1 .482
1.2 1 .394
1.3 1 .420
1.4 1 .948
Текстовый файл очень длинный — примерно 20 000 строк или около того. Теперь мне нужно прочитать это в моей программе на C ++, чтобы выполнить поиск Z для любой пары (X, Y). Если пара (X, Y) не совсем совпадает с той, что есть в моем входном файле, мне нужно использовать самое близкое значение X и самое близкое значение Y. Если бы у меня была полная матрица, а не только ненулевые значения, координаты X и Y были бы равномерно распределены.
Моя проблема в том, чтобы определить самый быстрый способ сделать это. Я хочу избежать поиска по вектору для поиска ближайшего X, а затем поиска по вектору для поиска ближайшего Y. Есть ли способ сделать это без зацикливания и поиска? Будет ли какая-то хеш-таблица для поиска значений?
Я сценарист и новичок в C ++, поэтому прошу прощения, если это кажется тривиальным. Так что для справки мне нужен быстрый способ сделать:
lookup(1.1,1)
>>> .482
lookup(1.112, 1)
>>> .482 // value corresponding to closest x and closest y
lookup(0,0)
>>> .642 // value corresponding to closest x and closest y
Это возможно напрямую, если бы у меня была полная матрица, например:
1.1 1.2 1.3 1.4 1.5
1.1
1.3
1.5 (Z values)
1.7
1.9
Чтобы найти значение Z, относящееся к (1.5, 1.2), я могу просто вернуть значение Z, найденное по индексу [1.5 / (x_spacing), 1.2 / (y_spacing)].
Конечно, мне также нужно вычесть значения моего поиска из этого интервала и округлить, если точная пара (X, Y) отсутствует. Суть, однако, в том, что это позволяет мне получить соответствующее значение Z без какого-либо поиска. Я хочу выполнить то же самое, за исключением того, что не занимаю все пространство, которое потребует гигантская полная матрица. Вот почему текстовый файл содержит только пары, соответствующие ненулевым значениям Z.
Любая помощь, которую вы можете предоставить, будет принята с благодарностью.
Я бы предложил хранить его в структурированном дереве. Квадратное дерево, например. Это будет редкое хранилище для экономии места, а также будет очень легко искать ближайшую точку.
Учебник по Quad Trees в C ++ Вот.
Других решений пока нет …