Jump to content
    

Работа со списком файлов директории

Хотя небольшой вопрос - все эти методы предполагают сравнение по значению некоего "ключа".

Но как получить этот "ключ" (например, в виде байта) из длиннющего имени файла?

 

Поразрядная сортировка подразумевает сортировку "по разрядам". Для имен файлов - это буквы. Начиная с последней. Т.к. у Вас названия файлов имеют разную длинну, то с последней начинать не стоит, т.к. может быть всего один файл с таким длинным именем. А надо хотя бы два. Вообщем, в статье написанно достатоно подробно и понятно.

 

К сожалению, она не годится для рассматриваемого случая.

 

Не вижу препятствий. Обьясните, плиз, чем не годится.

Share this post


Link to post
Share on other sites

Обьясните, плиз, чем не годится.

 

Слишком много обращений к данным. Несмотря на то, что не производятся сравнения самих данных, их значения очень интесивно читаются.

Share this post


Link to post
Share on other sites

Не все. А только log2(n). Массив ведь сортирован, значит, оптимальным будет бинарный поиск - берем элемент по центру массива, сравниваем, в зависимости от того, больше или меньше - переходим к верхней или нижней половине, и повторяем. Если элементов в массиве, например, от 128 до 256, то необходимо будет выполнить 8 сравнений и соответственно, 8 извлечений.

Точно, я уже даже сам :) догадался, что сравнивать надо не последовательно, а деля массив пополам...

Спасибо, возьму этот вариант за основу!

Будете в Тольятти - ящик с меня :beer:

Share this post


Link to post
Share on other sites

Спасибо, возьму этот вариант за основу!

 

Пожалуйста :) Мне кажется, это будет оптимальный вариант - 256 байт на индексы плюс буфера на текущее имя файла и буфер, в который будет читаться обрабатываемое имя файла.

Share this post


Link to post
Share on other sites

Слишком много обращений к данным. Несмотря на то, что не производятся сравнения самих данных, их значения очень интесивно читаются.

 

Понятно дело, что ради одной буквы из имени в ФАТ лезть не стоит. Можно буферизировать по 5 букв из имени каждого файла. Или если буфер заранее задан, то в зависимоти от количества файлов. Тогда на всю сортировку будет не так и много обращений.

Share this post


Link to post
Share on other sites

Можно буферизировать по 5 букв из имени каждого файла. Или если буфер заранее задан, то в зависимоти от количества файлов. Тогда на всю сортировку будет не так и много обращений.

 

5 букв да на 256 файлов - не дофига ли ОЗУ надо ;) И кстати, если все файлы с длиннючими именами, то очень скоро количество обращений превысит 1800 для моего алгоритма.

Share this post


Link to post
Share on other sites

Согласен. Было бы неплохо этот алгоритм "развернуть". Т.е. начинать с первых букв, тогда можно не идти до конца имен, если перестановки закончились. Но это уже близко к бинарному дереву. :)

Share this post


Link to post
Share on other sites

Было бы неплохо этот алгоритм "развернуть"

 

Да зачем? На таком малом количестве (до тысячи файлов) он точно будет хуже описанного мною бинарного поиска с последующей вставкой (обратите внимание на графики по Вашей ссылке, где поразрядная сортировка начинает обгонять quicksort, да еще и учтите, что STL - далеко не образец оптимизации по скорости). Либо по ОЗУ, либо по количеству считываний. Если хотите, реализуйте предложенный Вами алгоритм и устроим фаллосометрию. Для моего случая не более 1800 обращений к функции получения имени файла по индексу и 256 байт ОЗУ (2 буфера для строк не считаем, Вам они тоже понадобятся).

Share this post


Link to post
Share on other sites

Точно, я уже даже сам :) догадался, что сравнивать надо не последовательно, а деля массив пополам...

Пополам, не самый эффективный вариант :)- делить надо http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%...%BD%D0%B8%D1%8F

Share this post


Link to post
Share on other sites

Пополам, не самый эффективный вариант - делить надо

 

Для максимум-то восьми сравнений "отэтот гемморой"? Да ну нафиг ;)

 

Тем более, получится больше считываний. Тут как раз BS рулит по полной.

Share this post


Link to post
Share on other sites

Для максимум-то восьми сравнений "отэтот гемморой"? Да ну нафиг ;)

Трудностей никаких и нет, а массивы не только размером 256 записей бывают, а индексный массив не только в RAM лежать может, но и на той-же файловой системе - лишние обращения никчему.

Share this post


Link to post
Share on other sites

Трудностей никаких и нет, а массивы не только размером 256 записей бывают, а индексный массив не только в RAM лежать может, но и на той-же файловой системе - лишние обращения никчему.

 

Я предпочитаю иметь детерминированное количество обращений (для BS - log2(n)), а для золотого сечения - еще зависит от входного набора данных (т.е. от поведения целевой функции). Часто это хуже, чем мифический выигрыш. Кстати, асимптотически и BS, и золотое сечение - O(log(n)).

 

Но это мы уже плавно переходим на обсуждение глобальных теорий... Ну его в сад ;)

 

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

Share this post


Link to post
Share on other sites

Если хотите, реализуйте предложенный Вами алгоритм и устроим фаллосометрию.

 

Нее. Спасибо. Думаю, Ваш алгоритм действительно "длинее"... В смысле лучше. :)

 

З.Ы. если разберусь с глюками своей поделки на str912 тоже буду делать плеер. Тогда, может, и попробую сравнить алгоритмы.

Share this post


Link to post
Share on other sites

В принципе, вместо имени файла можно юзать ID3 тэги. Тут только придётся, кроме чтения имени из FAT, ещё и первый сектор файла читать...

Share this post


Link to post
Share on other sites

В принципе, вместо имени файла можно юзать ID3 тэги. Тут только придётся, кроме чтения имени из FAT, ещё и первый сектор файла читать...

 

Это даже более красиво с точки зрения интерфейса. Просто надо заменить список индексов в каталоге на список первых секторов. Кстати, заметно быстрее будет сортировка (все-таки чтение имени из каталога - весьма небыстрое занятие), но надо хачить работу с ФС - сделать функцию получения номера первого сектора файла.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...