Последовательный генератор гуида

Красные Черные деревья хороши для создания хорошо-сбалансированных-деревьев. Основная проблема с деревьями двоичного поиска состоит в том, что можно сделать их несбалансированными очень легко. Предположите, что Ваше первое число является 15. Тогда все числа после этого все больше меньше, чем 15. У Вас будет дерево, которое очень тяжело на левой стороне и ничего не имеет на правой стороне.

Красные Черные деревья решают это, вынуждая Ваше дерево быть сбалансированными каждый раз, когда Вы вставляете или удаляете. Это выполняет это через ряд вращений между узлами предка и дочерними узлами. Алгоритм на самом деле довольно прост, хотя это немного длинно. Я предложил бы взять СБРАСЫВАНИЕ (Cormen, Lieserson, Rivest и Stein) учебник, "Введение в Алгоритмы" и читающий на Деревьях RB.

реализация также не действительно так коротка, таким образом, это, вероятно, не действительно лучше всего для включения его здесь. Тем не менее, деревья используются экстенсивно для высокопроизводительных приложений, которые должны получить доступ к большому количеству данных. Они обеспечивают очень эффективный способ найти узлы с относительно маленькими издержками вставки/удаления. Снова, я предложил бы смотреть на, СБРАСЫВАЕТ для чтения о том, как они используются.

, В то время как BSTs не может использоваться явно - один пример использования деревьев в целом находится почти в каждом современном RDBMS. Точно так же Ваша файловая система почти наверняка представлена как своего рода древовидная структура, и файлы аналогично индексируются тот путь. Google питания деревьев. Питание деревьев примерно каждый веб-сайт в Интернете.

45
задан John Saunders 15 June 2015 в 19:01
поделиться

2 ответа

этот человек придумал что-то для создания последовательных руководств, вот ссылка

http://developmenttips.blogspot.com/2008/03/generate-sequential-guids-for-sql .html

соответствующий код:

public class SequentialGuid {
    Guid _CurrentGuid;
    public Guid CurrentGuid {
        get {
            return _CurrentGuid;
        }
    }

    public SequentialGuid() {
        _CurrentGuid = Guid.NewGuid();
    }

    public SequentialGuid(Guid previousGuid) {
        _CurrentGuid = previousGuid;
    }

    public static SequentialGuid operator++(SequentialGuid sequentialGuid) {
        byte[] bytes = sequentialGuid._CurrentGuid.ToByteArray();
        for (int mapIndex = 0; mapIndex < 16; mapIndex++) {
            int bytesIndex = SqlOrderMap[mapIndex];
            bytes[bytesIndex]++;
            if (bytes[bytesIndex] != 0) {
                break; // No need to increment more significant bytes
            }
        }
        sequentialGuid._CurrentGuid = new Guid(bytes);
        return sequentialGuid;
    }

    private static int[] _SqlOrderMap = null;
    private static int[] SqlOrderMap {
        get {
            if (_SqlOrderMap == null) {
                _SqlOrderMap = new int[16] {
                    3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10
                };
                // 3 - the least significant byte in Guid ByteArray [for SQL Server ORDER BY clause]
                // 10 - the most significant byte in Guid ByteArray [for SQL Server ORDERY BY clause]
            }
            return _SqlOrderMap;
        }
    }
}
25
ответ дан 26 November 2019 в 20:53
поделиться

Насколько мне известно, в NHibernate есть специальный генератор, называемый GuidCombGenerator. Вы можете посмотреть на это.

2
ответ дан 26 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

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