Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2017, 17:46   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Посоветуйте структуру данных...

Здравствуйте.
В какую структуру удобнее всего запихнуть следующие данные для работы?
Есть несколько ФИО.
Каждому ФИО соответствует от одного до нескольких данных типа:
  • TDate
  • Byte
  • Byte
Как лучше организовать данные, чтоб по ФИО можно было бы получить доступ к данным? Или если и есть такая структура, то особой разницы в таком доступе нет по сравнению с тем, что если я создам массив записей с двумя полями, первой в которой будет ФИО, а второй - ещё один массив из данных. А потом уже буду просто при обращении к определённому ФИО перебирать всё до нужного.

...или это может быть array of set, где set будет из record, а параллельно будет array of ФИО...

P.S. На всякий случай - у меня Delphi 7.

Последний раз редактировалось Ship_1; 11.01.2017 в 09:57.
Ship_1 вне форума Ответить с цитированием
Старый 10.01.2017, 20:12   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Обычная база данных(БД).

Цитата:
В какую структуру удобнее всего запихнуть следующие данные для работы?
Такого понятия в теории структур данных нет. Можно сказать что удобно использовать коллекции. Как правило коллекции реализованы на основе шаблонов Си++ в Delphi это дженереки.

Цитата:
Как лучше организовать данные, чтоб по ФИО можно было бы получить доступ к данным?
Неправильный вопрос. Все структуры данных(и коллекции) обладают свойствами доступа к данным.
Все структуры умеют методы для:
1) доступа к данным;
2) поиска;
3) удаления;
4) вставки.
Некоторые дополнительные методы
5) индесный доступ;
6) добавление.

Так вот структура выбирается что-бы оптимизировать скорость работы определённых методов. А не что-бы лучше получить доступ. Если вы не знаете какие операции у вас будут чаще использоваться, то подойдёт любая структура.
Но лучше Б+деревья которые работают среднем по среднему лучше всех. По всем методам первой группы O(log(N)).

Я бы взял коллекцию TList<T>. Она удобнее, в том плане что по сравнению с массивом там уже есть куча готовых методов просто подставляй данные и пользуйся. А для массивов всё ручками: сортировка, поиск, вставка и тд
http://docwiki.embarcadero.com/CodeE...TList_(Delphi)

Цитата:
...или это может быть array of set, где set будет из record, а параллельно будет array of ФИО...
Согласно правилам БД для быстрой работы данные должны быть нормализованы
https://ru.wikipedia.org/wiki/Нормальная_форма
Что это значит? Это значить что ФИО не должны повторяться. А этого можно добиться если вынести их в отдельный массив, а в первом массиве сделать индекс или ссылку на второй массив.
Это в теории позволяет ускорить такие операции как вставка, сортировка так как не придётся по символьно перемещать и сравнивать строки.

Но то в теории на практике может оказаться всё иначе. Виднеие проекта вещь такая что порой проще начать с простого массива с двумя полями ФИО и Данные.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 10.01.2017 в 20:17.
Pavia вне форума Ответить с цитированием
Старый 10.01.2017, 23:00   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Есть несколько ФИО
А сколько предположительно это несколько?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.01.2017, 09:56   #4
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Я бы взял коллекцию TList<T>. Она удобнее, в том плане что по сравнению с массивом там уже есть куча готовых методов просто подставляй данные и пользуйся. А для массивов всё ручками: сортировка, поиск, вставка и тд
http://docwiki.embarcadero.com/CodeE...TList_(Delphi)
Большое спасибо и за совет и за поясняющие комментарии! Вчера как раз наткнулся на понятие дженерика, когда попытался найти "словарь" в Дельфи по аналогии с Питоном. Но увидел, что TDictionary есть в Дельфи старше 7, а у меня как раз 7. Забыл упомянуть это в первом сообщении... Попробую разобраться с TList<T>. Если с ними можно работать в семёрке - может, освою для себя эту новую тему. Но пока у меня ощущение, что проще таки в массиве ручками всё сделать Если знаете что-то понятное для того, кто с этим пока вообще не сталкивался, и на русском - был бы признателен за ссылку.


Цитата:
Сообщение от Аватар Посмотреть сообщение
А сколько предположительно это несколько?
Для данной реализации - не больше 15-ти.
Ship_1 вне форума Ответить с цитированием
Старый 11.01.2017, 10:15   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

И данные где-то же хранить нужно. При таком количестве с СУБД нет смысла связываться. Можно в типизированном файле хранить и работать с массивом структур или с List. А можно ClientDataSet взять, который может в своей структуре выгрузить/загрузить данные в файл (попутно можно закракозяблить этот файл, хотя бы просто с использованием xor, затруднив его чтение сторонними средствами). И все плюсики его использования типа простого редактирования и наличия индексов для удобного поиска
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.01.2017, 10:27   #6
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

ClientDataSet не получится... У меня на работе только Portable-версия с 5 вкладками самых основных компонентов, среди которых этого нет.
Думаю, что меня вполне устраивает типизированный файл.

Pavia, увидел в статье про дженерики, что они появились с Дельфи 2009... Что ж, придётся работать ручками Зато понятнее.
Может, свой класс создать?.. Но я этим никогда не занимался и в классы не вникал. Мне, например, непонятно когда и зачем надо и не надо использовать и как осуществлять Create, Free и Destroy. И на данный момент мне кажется, что я в разы дольше буду разбираться с этим, чем сделаю с массивами из записей с дополнительными функциями поиска, а пользы будет меньше, чем затраченное время...
Кстати, а что подразумевалось в "в первом массиве сделать индекс или ссылку на второй массив"? Массив с ФИО сделать не просто массивом с ФИО, а массивом из записей с двумя полями: ФИО и индекс позиции во втором массиве?

Пока я пришёл к мнению, что лучше всего будет поступить так.
Код:
TData_FIO = record
  FIO: String;
  Day_index: array of byte;
end;
TVacation = record
  V_Date: TDate;
  V_len: byte;
  V_type: byte;
  FIO_index: byte;
end;
Staff: array of TData_FIO;
Vacations: array of TVacation;

Последний раз редактировалось Ship_1; 11.01.2017 в 11:41.
Ship_1 вне форума Ответить с цитированием
Старый 12.01.2017, 10:36   #7
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Сделайте на INI файлах.
Структура INI с фамилиями следующая:
Код:
[05A6216C-1074-4EEA-98E2-DCA40602592E]
FAM=Иванов
IM=Иван
OT=Иванович
UUID_DATA=C14E08E8-E92E-4CE9-AF4B-6363E7F92424,CA4E16B0-5C46-46F9-96C4-C60914AF650D
Структура INI с данными следующая:
Код:
[C14E08E8-E92E-4CE9-AF4B-6363E7F92424]
DATE=01.01.2010
Byte1=0
Byte2=1

[CA4E16B0-5C46-46F9-96C4-C60914AF650D]
DATE=01.01.2017
Byte1=10
Byte2=20
По первому файлу организуете поиск людей, из атрибута UUID_DATA получите набор индефикаторов для загрузки данных из вторго INI .

P/S:Ознакомтесь с методами чтения INI файла ReadSection,ReadSections,ReadSectio nValues,ReadStrng(integer,Bool и.т.д.)
Ознакомтесь с методами записи в INI файл WriteString(integer,Bool и.т.д.)
Ознакомтесь с методами удаления из INI файла DeleteKey

Скорость поиска будет напрямую зависеть от кол-ва данных и мощностей ПК

Минусы:
С сортировкой придется попотеть
Данные в открытом доступе и могут быть исправлены руками в блокноте
Пишу много и развернуто

Последний раз редактировалось Heneken87; 12.01.2017 в 10:51.
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на структуру данных. (Помогите) Testerok PHP 5 10.02.2014 18:18
Запись данных в структуру MatrixGru Общие вопросы Delphi 6 21.10.2013 10:30
С++.Ввод данных в структуру. Bullrock Помощь студентам 1 03.04.2012 13:55
[C++|Builder] Задача на структуру данных conqueror Помощь студентам 3 17.01.2009 14:25