Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая сортировка больших массивов данных, Наиболее быстрый метод сортировки 
:(
    Опции темы
Dementor
Дата 13.4.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Всем привет!

Опишу свою проблему, но сразу поясню - программированием давно не занимался (последний раз года полтора назад писал прогу для работы с xls и csv файлами).

Суть проблемы: есть массив данных в достаточно специфическом формате. Формат называется bin, используется для хранения данных лазерного сканирования в программе TerraScan (также las, fastbin и т.д.).

Каждая точка имеет достаточно большое количество параметров, но интересует всего несколько, а именно принадлежность к классу, отметка времени и координаты XYZ.

Что хочу реализовать - поиск одинаковых точек (одинаковые XYZ, например). Соответственно весь этот массив надо сортировать. Сортировка каким-нибудь пузырьком (воспоминания из универа) не подходит, т.к. массив может быть очень большой - десятки и сотни миллионов точек.
Не могли бы спецы подсказать - какой алгоритм позволит наиболее быстро обрабатывать такой большой массив данных.

Заранее огромное спасибо!!!!
PM MAIL   Вверх
kami
Дата 13.4.2012, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Что в конечном итоге нужно сделать с этими точками? Просто узнать количество одинаковых, или после сортировки (кстати, не уверен, что она вообще сможет отработать) проанализировать дополнительные параметры каждой из одинаковых?
PM MAIL WWW   Вверх
Pretorian
Дата 13.4.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.12.2011
Где: нигде

Репутация: нет
Всего: 1



PM   Вверх
Dementor
Дата 13.4.2012, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Вообще предполагается написание проги, которая будет удалять точки с одинаковыми параметрами (например с одинаковыми координатами). Т.е. надо найти все точки с одинаковыми координатами и оставить только одну.
PM MAIL   Вверх
kami
Дата 13.4.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Pretorian @  13.4.2012,  13:05 Найти цитируемый пост)
есть Быстрая сортировка и Сортировка слиянием

(имхо) любые сортировки в памяти не актуальны с учетом 
Цитата(Dementor @  13.4.2012,  12:57 Найти цитируемый пост)
массив может быть очень большой - десятки и сотни миллионов точек.

С учетом кучи параметров каждой точки, это выйдет (как минимум) не одна сотня мегабайт. Слишком велика вероятность наткнуться на EOutOfMemory, и даже если (каким-то чудом) нет - бедный файл подкачки.
PM MAIL WWW   Вверх
Dementor
Дата 13.4.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(kami @  13.4.2012,  13:09 Найти цитируемый пост)
С учетом кучи параметров каждой точки, это выйдет (как минимум) не одна сотня мегабайт. Слишком велика вероятность наткнуться на EOutOfMemory, и даже если (каким-то чудом) нет - бедный файл подкачки. 

Да действительно, эти файлы достаточно велики по объему. По сути речь идет об обработке файлов от 10 до 500 мегабайт.

PM MAIL   Вверх
Qu1nt
Дата 13.4.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Хеш-таблица.
PM MAIL   Вверх
Pretorian
Дата 13.4.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.12.2011
Где: нигде

Репутация: нет
Всего: 1



Цитата(Qu1nt @  13.4.2012,  15:16 Найти цитируемый пост)
Хеш-таблица.

что с ней делать?
PM   Вверх
Qu1nt
Дата 13.4.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Pretorian, данные из файла загрузить в хеш-таблицу. Дубликаты ликвидируются автоматически.
PM MAIL   Вверх
Pretorian
Дата 13.4.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.12.2011
Где: нигде

Репутация: нет
Всего: 1



Qu1nt, хотел предложить подобный вариант, но думал, что структура которая отсекает двойников называется множеством (Set)

Это сообщение отредактировал(а) Pretorian - 13.4.2012, 13:29
PM   Вверх
Dementor
Дата 13.4.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(Qu1nt @  13.4.2012,  13:16 Найти цитируемый пост)
Хеш-таблица. 

Сижу, читаю. Буду пытаться это реализовать. Думаю сначала на маленьком примере из 100 точек попробую. Мне самому даже интересно не столько 100% реализация задуманного (все равно делаю можно сказать для себя), сколько понимаю того как это можно реализовать, а там уже подгоню и производительность.
PM MAIL   Вверх
Qu1nt
Дата 13.4.2012, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Pretorian, множества обычно реализуют на основе хеш-таблиц.
Dementor, используй TDictionary из Generics.Collections.
PM MAIL   Вверх
Dementor
Дата 13.4.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Осмелюсь задать еще один вопрос.
Я как-то вообще с конца пошел...
А вопрос в следующем - как открыть файл с известной структурой?
Каким надо инструментом для этого пользоваться (предполагая работу с N числом файлов)? Соответственно, чтобы потом передать считанную инфу в TDictionary.
Могу привести структуру файла (Scan binary 16 bit line):
Код

typedef struct {
int HdrSize ; // sizeof(ScanHdr)
int HdrVersion ; // Version 20020715, 20010712, 20010129 or 970404
int RecogVal ; // Always 970401
char RecogStr[4]; // CXYZ
long PntCnt ; // Number of points stored
int Units ; // Units per meter = subpermast * uorpersub
double OrgX ; // Coordinate system origin
double OrgY ;
double OrgZ ;
int Time ; // 32 bit integer time stamps appended to points
int Color ; // Color values appended to points
} ScanHdr ;

Если объясните хотя бы примерно - буду очень благодарен.

Это сообщение отредактировал(а) Dementor - 13.4.2012, 14:46
PM MAIL   Вверх
Qu1nt
Дата 13.4.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



С помощью TBinaryReader читай только необходимые тебе поля.
PM MAIL   Вверх
Freimaks
Дата 14.4.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Цитата(Qu1nt @  13.4.2012,  13:40 Найти цитируемый пост)
С помощью TBinaryReader читай только необходимые тебе поля. 

Посидел, кое-что написал. Есть пара непонятных моментов, из-за которых все рушится. Пока я пытаюсь хотя бы считать данные из раздела Header (по сути мне от туда необходимо только одно поле):
Итак я объявляю все переменные:
Код

type TBinHeader = record
HdrSize: integer; // sizeof(ScanHdr)
HdrVersion: integer; // Version 20020715, 20010712, 20010129 or 970404
RecogVal: integer; // Always 970401
RecogStr: string[4]; // CXYZ
PntCnt: cardinal; // Number of points stored
Units: integer ; // Units per meter = subpermast * uorpersub
OrgX: double; // Coordinate system origin
OrgY: double;
OrgZ: double;
Time: integer; // 32 bit integer time stamps appended to points
Color: integer; // Color values appended to points
end;
var
  AFile: TFileStream;
  BR: TBinaryReader;
  BinHeader: TBinHeader;

Далее просто для того, чтобы понять чего я вообще получаю при чтении на выход я не только считываю, но и пишу все в memo
Код

begin
for ifiles:= 0 to ifilesall-1 do
  begin
  memo3.Lines.Clear;
AFile := TFileStream.Create(Opendialog1.Files.Strings[ifiles], fmOpenRead);
BR := TBinaryReader.Create(AFile, TEncoding.Default, false);
  try
    with BinHeader do
    begin
    HdrSize := BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(HdrSize)+#13;
    HdrVersion := BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(HdrVersion)+#13;
    RecogVal := BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(RecogVal)+#13;
    RecogStr:= BR.ReadString;
    memo3.Lines.Text:=memo3.Lines.Text+RecogStr+#13;
    PntCnt:= BR.ReadCardinal;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(PntCnt)+#13;
    Units:= BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(Units)+#13;
    OrgX:= BR.ReadDouble;
    memo3.Lines.Text:=memo3.Lines.Text+FloatToStr(OrgX)+#13;
    OrgY:= BR.ReadDouble;
    memo3.Lines.Text:=memo3.Lines.Text+FloatToStr(OrgY)+#13;
    OrgZ:= BR.ReadDouble;
    memo3.Lines.Text:=memo3.Lines.Text+FloatToStr(OrgZ)+#13;
    Time:= BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(Time)+#13;
    Color:= BR.ReadInteger;
    memo3.Lines.Text:=memo3.Lines.Text+inttostr(Color)+#13;
    BR.Close;
    end;
  finally
    BR.Free;
    AFile.Free;
end;
end;

for ifiles:= 0 to ifilesall-1 do - отвечает за работу если открыто несколько файлов (указание на файлы идет через OpenDialog).
Что получаю на выходе:
Код

56
20020715
970401
XYZ
54659977
582504482
5.076967755524E-299
-1.16115830415237E-118
1.99379198448988E-141
11969
33619970

До строки XYZ(далее у меня какой-то крестик в memo) все верно - как в документации к файлу.
Строка "XYZ(какой-то крестик)" по сути должна иметь вид "CXYZ". А далее видимо все рушится из-за неправильной отработки этой части файла (а может и нет...).
И это я не дошел даже до рездела с точками (где структура еще хлеще).
Подскажите, чего я делаю не так???
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.