Кто нам мешает слить массивы и отсортировать их по времени ?
Это структуры. Разве можно сортировать по значению структуры в массиве? Если можно, подскажите, как
Georgiy Merts:
Если массивы уже отсортированы - то и сортировать не надо - пишем алгоритм сливания с двумя указателями на каждом массиве, просматриваем следующий элемент на обоих, и скидываем в результирующий массив более ранний элемент, одновременно передвигая указатель на этом исходном массиве.
Видимо, придется так и делать. Я надеялся, что, может, будет более стандартный вариант. Надо тестить, но боюсь, что большой массив будет обрабатываться несколько секунд. А в моем случае, это не допустимо.
я конечно могу ошибаться, но сдаётся мне эта операция называется Join и есть она в любой СУБД и лучше данные изначально держать там.
посмотрите - в CodeBase должны быть либы для MySQL,SQLite (обе точно есть), MS-SQL и по идее должно быть ODBC вообще почти для всего что работает в винде.
У меня есть 2 очень больших массива (может быть до миллиона элементов) структур вида
Их нужно объединить так, чтобы недостающие элементы (по времени) из одного массива попали в другой. Пример на картинке. Сохранить последовательность по времени необходимо.
Подскажите, как это можно сделать максимально рационально (максимально быстро).
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
Sergey Savinkin: Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
MQL -> DLL ->любая БД. Имхо, проще всего SQLite - там сама СУБД DLL. И писать не в файл, а в БД, ну и читать оттуда при необходимости.
Sergey Savinkin: Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
вы изобрели себе "бутылочное горлышко" и теперь героически преодолеваете трудности :-)
просто пишите в разные файлы. А данные пусть объединяет тот кто читает. На край можно в ночи в 23.57 запустить скрипт и объеденить прежние данные в архив
Мысль понял, но моих знаний не хватит на организацию СУБД. Спасибо за совет.
СУБД не надо организовывать.) Скажем Access, SQL Server, MySQL, SQLite и пр. - это и есть СУБД. Вам только таблицу(ы) сделать и немного язык SQL посмотреть. Экземплы делаем под себя, и все дела. Предварительно можно в Access немного потренироваться-отработать.
Сделал, как и рекомендовали, через перебор по 2-м указателям. Насколько быстро работает на больших массивах - сказать не могу, буду тестить.
void Func(Str_Arr &arr1[],Str_Arr &arr2[])
{
Str_Arr res[];
int size1 = ArraySize(arr1);
int size2 = ArraySize(arr2);
int sizeRes=size1+size2;
ArrayResize(res,sizeRes);
int pos1=0,pos2=0,posRes=-1;
for(int i=0; i<sizeRes; i++)
{
if(pos1>=size1) // массив 1 все...
{
if(pos2>=size2) // оба массива закончились
{
break;
}
posRes++;
res[posRes].Time=arr2[pos2].Time;
res[posRes].Price=arr2[pos2].Price;
pos2++;
continue;
}
else
{
if(pos2>=size2) // второй перебрали, остался первый
{
posRes++;
res[posRes].Time=arr1[pos1].Time;
res[posRes].Price=arr1[pos1].Price;
pos1++;
continue;
}
}
// нужно сравнивать оба массиваif(arr1[pos1].Time==arr2[pos2].Time) // одинаковые массивы, добавляем данные из любого
{
posRes++;
res[posRes].Time=arr1[pos1].Time;
res[posRes].Price=arr1[pos1].Price;
pos1++;
pos2++;
}
else
{
if(arr1[pos1].Time<arr2[pos2].Time) // время первого меньше, двигаем его
{
posRes++;
res[posRes].Time=arr1[pos1].Time;
res[posRes].Price=arr1[pos1].Price;
pos1++;
}
else// а тут - второй массив
{
posRes++;
res[posRes].Time=arr2[pos2].Time;
res[posRes].Price=arr2[pos2].Price;
pos2++;
}
}
}
ArrayResize(res,posRes+1); // отрежем лишнее
}
Спасибо всем, кто откликнулся.
P.S. Теоретически, можно и сортировку входящих массивов сделать, если создать двумерный массив типа double. Array[][1]. И в него перебором цикла скопировать этот массив (дату преобразовывать также в тип doouble). Дата помещается в первое измерение, цена - во второе. Сортировка двумерного массива по первому измерению возможна. После сортировки массив также перебирается и double обратно переформатируется в дату.
Кто нам мешает слить массивы и отсортировать их по времени ?
Это структуры. Разве можно сортировать по значению структуры в массиве? Если можно, подскажите, как
Если массивы уже отсортированы - то и сортировать не надо - пишем алгоритм сливания с двумя указателями на каждом массиве, просматриваем следующий элемент на обоих, и скидываем в результирующий массив более ранний элемент, одновременно передвигая указатель на этом исходном массиве.
Видимо, придется так и делать. Я надеялся, что, может, будет более стандартный вариант. Надо тестить, но боюсь, что большой массив будет обрабатываться несколько секунд. А в моем случае, это не допустимо.
я конечно могу ошибаться, но сдаётся мне эта операция называется Join и есть она в любой СУБД и лучше данные изначально держать там.
посмотрите - в CodeBase должны быть либы для MySQL,SQLite (обе точно есть), MS-SQL и по идее должно быть ODBC вообще почти для всего что работает в винде.
Здравствуйте, уважаемые участники форума.
У меня есть 2 очень больших массива (может быть до миллиона элементов) структур вида
Их нужно объединить так, чтобы недостающие элементы (по времени) из одного массива попали в другой. Пример на картинке. Сохранить последовательность по времени необходимо.
Подскажите, как это можно сделать максимально рационально (максимально быстро).
В MS Access можно сделать моментально.
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
MQL -> DLL ->любая БД. Имхо, проще всего SQLite - там сама СУБД DLL. И писать не в файл, а в БД, ну и читать оттуда при необходимости.
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
вы изобрели себе "бутылочное горлышко" и теперь героически преодолеваете трудности :-)
просто пишите в разные файлы. А данные пусть объединяет тот кто читает. На край можно в ночи в 23.57 запустить скрипт и объеденить прежние данные в архив
Не работает. Вот это:
MQL -> DLL ->любая БД. Имхо, проще всего SQLite - там сама СУБД DLL. И писать не в файл, а в БД, ну и читать оттуда при необходимости.
Мысль понял, но моих знаний не хватит на организацию СУБД. Спасибо за совет.
Мысль понял, но моих знаний не хватит на организацию СУБД. Спасибо за совет.
СУБД не надо организовывать.) Скажем Access, SQL Server, MySQL, SQLite и пр. - это и есть СУБД. Вам только таблицу(ы) сделать и немного язык SQL посмотреть. Экземплы делаем под себя, и все дела. Предварительно можно в Access немного потренироваться-отработать.
Сделал, как и рекомендовали, через перебор по 2-м указателям. Насколько быстро работает на больших массивах - сказать не могу, буду тестить.
Спасибо всем, кто откликнулся.
P.S. Теоретически, можно и сортировку входящих массивов сделать, если создать двумерный массив типа double. Array[][1]. И в него перебором цикла скопировать этот массив (дату преобразовывать также в тип doouble). Дата помещается в первое измерение, цена - во второе. Сортировка двумерного массива по первому измерению возможна. После сортировки массив также перебирается и double обратно переформатируется в дату.