Как я получаю размер каталога в C?

Не существует способа сортировки с O (n) сложностью по времени. Посмотрите на сложность наихудшего случая для популярных алгоритмов в Википедии.

Лучшая временная сложность в худшем случае - O (nlogn). Вот как мы можем решить это за O (nlogn) сложность времени:


    let array = [1, 6, 6, 6, 6, 4, 3, 5, 5, 5, 2, 2]

    extension Array where Element: Comparable & Hashable {
        func countableSorted() -> [Element] {
            var counts = [Element: Int]()
            // O(n)
            for element in self {
                counts[element] = (counts[element] ?? 0) + 1
            }

            // I think that standart method uses O(nlogn) time complexity.
            // O(nlogn) + O(n) approximately equal to O(nlogn).
            let sorted = counts.sorted { item1, item2 -> Bool in
                if item2.value > item1.value {
                    return true
                }

                if item2.value == item1.value {
                    return item2.key > item1.key
                }

                return false
            }

            var result = [Element]()
            // O(n)
            for item in sorted {
                let items = Array(repeating: item.key, count: item.value)
                result.append(contentsOf: items)
            }

            // Total time complexity for worst case scenario is O(nlogn)

            return result
        }
    }

    print(array.countableSorted())

    // Output: [1, 3, 4, 2, 2, 5, 5, 5, 6, 6, 6, 6]

9
задан John Carter 23 January 2009 в 13:23
поделиться

2 ответа

$ man nftw

Имя:

ftw, nftw - обход дерева файла

ОПИСАНИЕ

ftw() обходы через дерево каталогов, которое расположено в соответствии с каталогом dirpath и вызовами fn() однажды для каждой записи в дереве. По умолчанию каталоги обрабатываются перед файлами и подкаталогами они содержат (сделайте предзаказ обхода).

ПРИСПОСАБЛИВАНИЕ

POSIX.1-2001, SVr4, SUSv1.

Простой пример

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

static unsigned int total = 0;

int sum(const char *fpath, const struct stat *sb, int typeflag) {
    total += sb->st_size;
    return 0;
}

int main(int argc, char **argv) {
    if (!argv[1] || access(argv[1], R_OK)) {
        return 1;
    }
    if (ftw(argv[1], &sum, 1)) {
        perror("ftw");
        return 2;
    }
    printf("%s: %u\n", argv[1], total);
    return 0;
}
27
ответ дан 4 December 2019 в 07:36
поделиться

Нет никакой готовой функции, таким образом, необходимо будет сделать собственное. Можно посмотреть на исходный код GNU implemenation du как пример (см. http://www.gnu.org/prep/ftp.html для списка мест для загрузки с). Это находится в coreutils пакет.

Решающие вызовы Posix, вероятно, opendir, readdir, closedir, и stat.

2
ответ дан 4 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: