Редкий многомерный массив или матричные библиотеки в.NET

Сортировка, пропуск и т. Д. Могут быть довольно медленными в зависимости от размера вашей коллекции.

Лучшая производительность была бы достигнута, если бы ваша коллекция была проиндексирована по некоторым критериям; и затем вы можете использовать курсор min ():

Во-первых, индексировать свою коллекцию с помощью db.collectionName.setIndex( yourIndex ). Вы можете использовать возрастающий или нисходящий порядок, что здорово, потому что вы всегда хотите «N последних элементов» ... так что если вы индексируете в порядке убывания, это то же самое, что и получение «первых N элементов».

Затем вы находите первый элемент вашей коллекции и используете значения его индексного поля в качестве минимальных критериев в поиске, например:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

Вот ссылка для курсора min (): https: //docs.mongodb.com/manual/reference/method/cursor.min/

5
задан MSalters 30 September 2013 в 18:22
поделиться

3 ответа

Я бы порекомендовал dnAnalytics .

2
ответ дан 14 December 2019 в 19:22
поделиться

Это довольно просто реализовать свой собственный с помощью словаря. Приведенная ниже реализация работает для двух измерений, но вы можете легко реализовать трехмерные или четырехмерные. Хранение очень эффективно, когда матрица разреженная. Это не лучшая реализация, если вы планируете часто добавлять или удалять столбцы.

class SparseMatrix<T>
    {
        public T this[int i, int j]
        {
            get
            {
                T result;
                if (!_data.TryGetValue(new Key(i, j), out result))
                    return default(T);
                return result;
            }
            set { _data[new Key(i, j)] = value; } // Could remove values if value == default(T)
        }

        private struct Key
        {
            public Key(int i, int j)
            {
                _i = i;
                _j = j;
            }

            private readonly int _i;    
            private readonly int _j;
            public override bool Equals(object obj)
            {
                if (!(obj is Key))
                    return false;
                var k = (Key) obj;
                return k._i == _i && k._j == _j;
            }

            public override int GetHashCode()
            {
                return _i << 16 + _j; // Could be smarter based on the distribution of i and j
            }


        }

        private readonly Dictionary<Key, T> _data = new Dictionary<Key, T>();
    }
2
ответ дан 14 December 2019 в 19:22
поделиться

как Вы бы «легко реализовали», скажем, четырехмерную матрицу или тензор? Я вижу только индексы i и j выше ...

1
ответ дан 14 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

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