Я должен реализовать k ближайших соседей, ищут 10 размерных данных в kd-дереве.
Но проблема состоит в том, что мой алгоритм очень быстр для k=1, но так же как 2000x медленнее для k> 1 (k=2,5,10,20,100)
Действительно ли это нормально для kd деревьев, или я делаю что-то неправильно?
Вернувшись в 2002 году, когда я был прямым из колледжа, и работа было мало и далеко между до Dot-Com Bust, я присоединился к сервисной компании, которая использовалась для создания программного обеспечения для их клиентов в Java. Мне пришлось сидеть в кабинете клиента (который был Ramshackle Room в электрической подзаконе, оснащенной AC, чтобы сохранить работу серверов), совместно используя стулья / шт с другими парнями в команде. Другие инженеры (если я смогу позвонить им инженеров;) в группе, используемой для внесения изменений AD-HOC для исходного кода, компилируйте файлы и помещают их в производство.
Отчеты о производственных серверах, происходящих из-за неудачных попыток копирования на файлы на сервер (пропущенный файл, который будет скопирован, резервные копии, полученные потерянные или неправильные файлы, скопированные или не все файлы, скопированные), были встречены с пожиманием (О нет, это вниз? Давайте посмотрим, что произошло; Эй, кто изменил то, что недавно ... УМММ ...).
В те дни, проведев несколько разочаровывающих дней, пытаясь выяснить, кто и сжимается за кодом, я разработал систему для комментариев в списке в заголовке исходного файла, который подробно описан следующее:
через два месяца спустя, когда список угрожал оспаривать размер исходного кода в файле, менеджер имел яркое представление о получении источника Система управления версиями.
Мне никогда не нужно было поместить какие-либо комментарии в заголовки исходных файлов (за исключением уведомлений об авторских правах) в любой компании, с которой я работал с тех пор. В моей нынешней компании все остальное в основном самоочевидно, глядя на код или собираюсь в систему отчетности ошибок, которая интегрирована с системой управления исходной версией.
-121--2498563-Ну, он в первую очередь зависит от вашей конкретной реализации и набора данных.
Плохо сбалансированное дерево будет означать, что вы должны найти больше данных, чем вам нужно. Убедитесь, что ваше дерево построение в здравом уме.
Это также может зависеть от того, как вы найдете k соседей. Если ваш алгоритм ищет дерево для ближайшего соседа и сохраняет его, затем ищет второй ближайший и сохраняет его и т. Д., Тогда вы не выполняете поиск очень эффективно. Вместо этого держите бегущий список ближайших соседей K и удары от списка, когда вы находите ближе, проходящие на дереве. Таким образом, вы ищете один раз, а не в раз.
В любом случае, похоже, вы делаете это для курса. Попробуйте поговорить с вашим профессором, TAS или одноклассниками, чтобы увидеть, типичны ли ваши результаты.
Я знаю, что на этот вопрос был дан ответ, но для получения более подробной информации о поиске KNN с k-d деревьями см. Bentley (1975: 514), Сообщения ACM 18 (9), сентябрь.