A read
вызов прочитает указанное количество байтов из «файла». Я использую «файл», потому что фактической целью может быть каталог, сетевой сокет или даже канал, динамически генерируемый другой программой. Если цель на самом деле является файлом, каким мы его знаем, и который обычно поддерживает поиск, то вызов read также продвинет позицию смещения в соответствии с тем, сколько байтов он прочитал. Думайте об этом как о воспроизведении песни, если вы слушаете минуту и делаете паузу, вы находитесь на отметке в одну минуту, и если вы продолжите (read
), вы продолжите с этой последней точки. Если вы хотите go до конца песни, вам придется слушать (и ждать) длительность песни, поэтому операция O (n).
Теперь поиск эквивалентен просто прокрутите панель в любую позицию, которую вы хотите. Между прыжком ничего не читается. Вот что имел в виду ваш профессор, отделяя движение от операции. Таким образом, переход по файлу является операцией O (1). Очевидно, это возможно, только если файл поддерживает произвольный доступ. Файлы хранятся на вашем жестком диске / SSD, но магнитная лента c (которая была распространена во время разработки Unix) - нет. Я не уверен, почему в ваших заметках написано Linux, используйте seek
вместо read
. Очевидно, что при работе с общими файлами Linux и другие системы могут использовать seek
, чтобы установить смещение для интересных данных и просто прочитать их. Например, тег ID3v1 в файлах MP3 находится в последних 128 байтах файла, поэтому ОС переместится в эту позицию для отображения информации о песне, прежде чем вернуться к началу файла, если будет сказано воспроизвести файл. Однако при чтении информации о песне и ее воспроизведении ОС все равно будет использовать read