Помощь новичкам

Объясните подробнее что за индексы.

Индекс - текущий элемент в списке.

Например: 0,1,2,3,4,5,6,7,8,9,10

Если читать и всегда удалять текущий элемент, то индекс всегда нулевой, а вот если переходить на следующий без удаления, нужно отслеживать текущую позицию, где происходит чтение.

То есть, методы на подобии .Succ (следующий) и .Pred (предыдущий) и свойство Индекс где-то реализовано ? Пока читаю связанные списки.

Тогда не укладывается это

Зачем массив индексов если индекс 1?

Индекс (указывающий на текущий элемент) всегда нулевой только если после чтения элемент обязательно удаляется

x:=L[i].FirstOrDefault; // подразумевается 0-й элемент
L[i].RemoveAt(0); // 1-й стал нулевым, новый индекс запоминать не нужно

а вот если ненужно удалять, следует перейти на новый элемент и обновить текущий “индекс”

x:=L[i] [N[i]]; // получить из i-го списка N[i]-й элемент
N[i]+=1; // перейти на следующий 
// и проверить границы

Проблема в том, что таких списков более десятка - неудаляемые (точно читаются), удаляемые (значения после прочтения всегда удаляются) и смешанные (некоторые элементы читаются, а другие после чтения удаляются) и в обе стороны.

Я думал как одна птица, что проблема будет с добавлением новых значений в конец списков, но всё нормально и пока выбираю между классами или чем-то более подходящим чем List-ы.

То есть у вас List<List<>> + вообще в отдельной переменной индексы в каждом внутреннем списке? Это плохо. Индексы должны быть в той же переменной, иначе очень легко забыться и добавить сложно-ловимый баг.

type
  LstPlusInd<T> = class //ToDo нормальное название
    private lst: List<T>;
    private ind: integer;
    
    //ToDo реализовать все нужные вам операции
    
  end;
  
begin
  var l := new List<LstPlusInd>;
end.
1 лайк

Самая неграмотная фраза, из всех что я встречал в последние, наверно, полгода. В списке нет индексов, там есть только голова, хвост и текущий элемент. А еще там есть связи.

Это в связном списке, а про него ничего не говорили.

В несвязном просто нет связей. Голова, хвост и текущая позиция. Как ленточка в машине Поста. А List в .NET - это не список в его классическом понимании, это динамическая структура на базе ассоциативного массива.

Александр, в десятке списков нужно отслеживать каждый последний прочитанный номер элемента (“индекс”, “курсор”, “указатель”), а без внешней инфраструктуры это возможно только с обязательным удалением (см. пример выше).

Именно поэтому и приходится как-то запоминать “индексы”, что и стало причиной вопроса. Так что поделитесь обоснованным мнением: оставить списки с массивами, списки лучше заменить на что-то другое (класс) или же не отвлекайте тех, кто может знать ответ. Спасибо :grinning:

Пишите осторожнее - вас студенты читают.

Список построен на базе непрерывного участка памяти. Список - оболочка над массивом с возможностью расширения.

Хорошо. Д. Кнут, например, различает линейные списки (стек, очередь, дек), циклические и нелинейные (связные), такие как деревья. Ни в одной такой информационной структуре индексами и не пахнет. У М.Абрамяна о List говорится, как об обобщенным классе, реализующим поведение списка и выполненном на базе массива. Майкрософт поясняет, что коллекция List представляет собой строго типизированный список объектов, доступных по индексу. Но в любом варианте это не есть классический список. Когда говорят об объекте коллекции List - вопросов нет. Но когда говорят о списке, а потом выясняется, что имеется в виду List - ну это как в Питоне называют списки массивами, привыкают к этой мысли, а потом всегда считают, что массив - это и есть список.

Пока Вы нормально не поясните, что называете “списком”, говоря об отслеживании в их десятках тех или иных элементов, угадать как обрабатывать это “то, не знаю что” нереально.

Реально. С чего вы решили, что при слове “список” надо вспоминать кнута и “связный список”?

Слово “список” встречается в куда более общем контексте - список учеников в журнале например.

В .NET есть прямой тип List - когда мы говорим “список” в NET - мы подразумеваем именно его.

А когда мы говорим “связный список”, - подразумеваем LinkedList

2 лайка

С того, что понятие “список” в обиходе - это синоним слова “перечень”. А в программировании есть свое понятие списка и оно Уже общебытового.

Вот именно потому я и хотел бы уточнения, о каком списке речь - .NET или общебытовом.

Если упрощённо, пусть имеются файлы

А=2,3,2,-2,0,1...
Б=1,4,-1,0,30...
В=3,3,-2,3,-4...

начальная позиция которых («индексы») указывает на первые элементы (по нулям).

Прочитав из файла А значение альфа (2), нужно в файле Б сместиться вверх или вниз (положительное или отрицательное) на указанное количество элементов и узнать значение бета (4), а в файле В также сместиться вверх или вниз на бета элементов и прочитать в переменную гамма (3), удаляя этот элемент. Особенность в том, что файлы учитывают текущее положение.

Так как таких файлов с десяток и сложнее удалять-добавлять в произвольном порядке, я сделал массив List<integer> и вынес их текущую позицию («индексы») в отдельный массив, что не очень удобно. Все списки «зациклены» и периодически пополняются.

Структура и подход приемлемы или есть более подходящие варианты ?

Если нужны множественные вставки и удаления, проще всего, безусловно, использовать готовые списочные структуры. Для прямой выборки элемента по его номеру ничего эффективнее массива пока что не придумано. Списки List в .NET реализуют сразу оба подхода к хранению и выборке данных, поэтому они - достаточно удачный выбор. Если имеются какие-то особые алгоритмы, связанные со спецификой обрабатываемых данных, можно попытаться реализовать собственный класс. Например, в базах данных существует понятие совокупности индексных файлов, когда сами элементы данных упорядочиваются и удаляются нечасто (это определяет система управления базой данных), а доступ осуществляется через целую систему индексных файлов, содержащую ключи и такие файлы строятся, например, на основе сбалансированных В-деревьев, что обеспечивает высокую скорость поиска. Но, насколько я понял, это не Ваш случай, у Вас поиск простой, практически это косвенная адресация.

1 лайк

Почему максимальный индекс динамического массива = 536870897?

Откуда вы взяли это число?

1 лайк

2^29 -5. Занимательно.

Число-то откуда?

Ну вот беру я, пишу в программе код:

var
  a: array of integer;
begin
  a:=new integer[536870898];
end.

Выполняю. Выдаёт ошибку:

Ошибка времени выполнения: System.OutOfMemoryException: Измерения массива превысили поддерживаемый диапазон.
Стек:
   в Program1.Program.$Main() в C:\PABCWork.NET\Program1.pas:строка 4
   в Program1.Program.Main()

Почему?