Временная сложность вложенных для цикла

Хотя уже довольно поздно, я все равно публикую этот ответ . В большинстве случаев вам не нужно переустанавливать свои ограничения и повторно добавлять ваши подпредставления в ваше представление super / parent. Таким образом, ваши setUpViews() и setUpConstraints() должны быть действительно внутри override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?), например, так:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    setUpViews()
    setUpConstraints()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Кроме того, вам не нужно (в большинстве случаев, опять же), по крайней мере для меня, установить приоритеты для ваших ограничений. По мере возможности решайте проблемы / предупреждения об ограничениях без снижения приоритетов.

badLabel.layoutIfNeeded() тоже не нужно, если только вы на самом деле не изменяете некоторые константы своих ограничений или не перестраиваете свое ограничение. Хорошо, имеет смысл использовать такую ​​строку, если вы ДЕЙСТВИТЕЛЬНО хотите настроить все в вашем layoutSubviews()

Весь этот класс, похожий на вашу ячейку, работал для меня:

class BadCustomTableViewCell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setUpViews()
        setUpConstraints()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    let badLabel:UILabel = {
        let label = UILabel()
        label.font = UIFont.systemFont(ofSize: 40, weight: UIFont.Weight.light)
        label.text = "899"
        label.textColor = .black
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    func setUpViews() {
        contentView.addSubview(badLabel)
    }

    func setUpConstraints() {
        badLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        let safeMargin:CGFloat = badLabel.frame.size.width - 15
        badLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: -safeMargin).isActive = true
        badLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: safeMargin).isActive = true
    }
}
30
задан Lii 13 November 2016 в 17:59
поделиться

2 ответа

Да, вложенные циклы являются одним способом быстро получить большую нотацию O.

Обычно (но не всегда) один цикл, вложенный в другом, вызовет O (nВІ).

Думают об этом, внутренний цикл выполняется я времена, для каждого значения меня . Внешний цикл выполняется n времена.

таким образом Вы видите шаблон выполнения как это: 1 + 2 + 3 + 4 +... + n времена

Поэтому мы можем, связал количество выполнения кода путем высказывания, что оно, очевидно, выполняет больше, чем n времена (нижняя граница), но с точки зрения n, сколько раз мы выполняем код?

ну, математически мы можем сказать, что это выполнит не больше, чем nВІ времена, давая нам худший вариант развития событий и поэтому наше Большое О, связанное O (nВІ). (Для получения дополнительной информации о том, как мы можем математически сказать, что этот взгляд Степенной ряд )

Большой О не всегда имеет размеры точно, сколько работы делается, но обычно дает надежному приближению худшего варианта развития событий.

<час>

4 года более позднее Редактирование: , поскольку это сообщение, кажется, получает изрядное количество трафика. Я хочу более полно объяснить, как мы связали выполнение с O (nВІ) использование степенного ряда

С веб-сайта: 1+2+3+4... +n = (nВІ + n)/2 = nВІ/2 + n/2. Как, затем мы превращаем это в O (nВІ)? То, что мы (в основном) говорим, то, что nВІ> = nВІ/2 + n/2. Действительно ли это верно? Давайте сделаем некоторую простую алгебру.

  • Умножают обе стороны на 2 для получения: 2nВІ> = nВІ + n?
  • Расширяются 2nВІ до get:nВІ + nВІ> = nВІ + n?
  • Вычитают nВІ из обеих сторон для получения: nВІ> = n?

должно быть ясно, что nВІ> = n (не строго больше, чем, из-за случая, где n=0 или 1), предполагая, что n всегда является целым числом.

Фактическая Большая сложность O немного отличается, чем, что я просто сказал, но это - суть ее. В действительности спрашивает Большая сложность O, существует ли константа, мы можем обратиться к одной функции, таким образом, что это больше, чем другой для достаточно большого входа (См. Википедия страница)

50
ответ дан gsamaras 27 November 2019 в 23:10
поделиться

Действительно, это - O (n^2). См. также очень похожий пример с тем же временем выполнения здесь .

9
ответ дан Community 27 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

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