Не существует способа сортировки с 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]
$ 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;
}
Нет никакой готовой функции, таким образом, необходимо будет сделать собственное. Можно посмотреть на исходный код GNU implemenation du как пример (см. http://www.gnu.org/prep/ftp.html для списка мест для загрузки с). Это находится в coreutils
пакет.
Решающие вызовы Posix, вероятно, opendir
, readdir
, closedir
, и stat
.