Сложность вложенных циклов

У меня была такая же проблема, как и у вас, а затем, наконец, удалось разрешить ее после прочтения документации в типизированных файлах TS mongoose (о которой я раньше не знал, и я не уверен, как долго документы были вокруг), в частности в этом разделе . Я понимаю, что это старый вопрос очень , но я думал, что это может помочь потерянному человеку в будущем. Изменить: я прочитал дату существующего ответа как март 2014 года, а не 14 марта.


Что касается вашего дела, вы захотите следовать аналогичный шаблон, который у вас есть, хотя вам нужно изменить несколько вещей в обоих файлах.

Файл IUser

  1. Переименуйте IUser в IUserDocument.
  2. Импортировать Document из mongoose.
  3. Расширить интерфейс из Document.

Файл модели

  1. Переименуйте все экземпляры IUser на IUserDocument, включая путь к модулю, если вы переименуете файл.
  2. Переименуйте только определение IUserModel к IUser.
  3. Измените то, что IUser простирается от, от IUserDocument, Document до IUserDocument.
  4. Создайте новый интерфейс с именем IUserModel, который простирается от Model .
  5. Объявите свои статические методы в IUserModel.
  6. Измените постоянный тип User с Model на IUserModel, так как IUserModel теперь расширяет Model.
  7. Измените аргумент типа на ваш вызов модели с на .

Вот как выглядит ваш файл модели с этими изменениями:

import * as bcrypt from 'bcryptjs';
import { Document, Schema, Model, model } from 'mongoose';

import { IUserDocument } from '../interfaces/IUserDocument';

export interface IUser extends IUserDocument {
    comparePassword(password: string): boolean; 
}

export interface IUserModel extends Model {
    hashPassword(password: string): boolean;
}

export const userSchema: Schema = new Schema({
    email: { type: String, index: { unique: true }, required: true },
    name: { type: String, index: { unique: true }, required: true },
    password: { type: String, required: true }
});

userSchema.method('comparePassword', function (password: string): boolean {
    if (bcrypt.compareSync(password, this.password)) return true;
    return false;
});

userSchema.static('hashPassword', (password: string): string => {
    return bcrypt.hashSync(password);
});

export const User: IUserModel = model('User', userSchema);

export default User;

И ваш (недавно переименованный) модуль ../interfaces/IUserDocument будет выглядеть так:

import { Document } from 'mongoose';

export interface IUserDocument extends Document {
    email: string;
    name: string;
    password: string;
}

0
задан JoKeRxbLaCk 25 March 2019 в 10:07
поделиться

2 ответа

С учетом того, что циклы не имеют return, break и т. Д. (Например, исключение броска), полнота равна

O(n * (m + j)) == O(n * m) + O(n * j)

, если оба m и j являются константами у нас есть

O(n*m + n*j) == m * O(n) + j * O(n) == O(n)  

если хотя бы один m или j такой, что m ~ n или j ~ n, то имеем

// here m ~ n and j is some const
O(n * m) + O(n * j) == O(n * n) + j * O(n) == O(n**2) + O(n) == O(n**2)
0
ответ дан Dmitry Bychenko 25 March 2019 в 10:07
поделиться

Как сказал @RobinBennet, ответ - O(n * (m + j)).

Внешний цикл повторяется n раз (по одному на каждый элемент). Для каждого элемента во внешних циклах первый внутренний цикл повторяется m раз, а второй j - так что для каждого элемента вы выполняете O (m + j) шагов. Выполните итерацию по n элементам O (n * (m + j).

То есть, предполагая, что m, j не связаны с n - если, например, m = j = n, вы получите O (п ^ 2)

0
ответ дан Null Terminator 25 March 2019 в 10:07
поделиться
Другие вопросы по тегам:

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