#java #kotlin #big-o
Вопрос:
Какова временная сложность назначения объектов с использованием знака равенства в Kotlin (или Java)?
fun moveZeroes(nums: IntArray): Unit {
var numsCopy = nums
}
Более конкретно, если у меня есть свой собственный список объектов
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
Каково будет время копирования ниже?
fun mergeTwoLists(l1: ListNode?, l2: ListNode?): ListNode? {
var l1Copy = l1
}
Я часто выполняю это задание, так как ListNode проходит как val, и я не могу этого сделать
l1 = l1?.next
Ответ №1:
Задание
var l1Copy = l1
не создает новый ListNode
объект, содержащий те же свойства, l1
что и . Он просто создает новую переменную с именем l1Copy
и указывает ее в ту же ячейку памяти l1
, что и, так что это операция O(1).
В следующем коде
fun f(n: ListNode) {
var n1 = n
}
val node = ListNode(1)
val var1 = node
f(node)
есть только один объект ListNode(1)
и три переменные, указывающие на него: node
и var1
в глобальной области, и n
и n1
в f
области.
Комментарии:
1. Этот ответ верен. Список-это объект, и объекты всегда передаются по ссылке, даже для назначений. Для копирования OP должен использовать соответствующую
copy()
функцию. Это следует добавить к ответу.2. Отличный ответ, спасибо. Поэтому в моем первом примере я передавал узел списка в функцию в качестве параметра. Все параметры передаются как val в котлине. Если я сделаю
var l1Copy = l1
это, как l1Copy станет изменяемым, еслиl1
он был неизменяемым иl1Copy
является просто указателем на ту же ячейку памяти? Изменениеl1Copy
, кажется, не меняетсяl1
Ответ №2:
Если метод содержит только операторы присваивания с постоянным временем, операторы if, условные выражения и тому подобное, скорее всего, это операция или метод с постоянным временем. Если он содержит цикл, есть вероятность, что он не является постоянным по времени.
Но вы должны быть осторожны, как показывает следующий пример. Рассмотрим массив b и следующие операторы:
int sum= 0;
for (int k= 0; k < Math.min(50, b.length); k= k 1)
sum= sum b[k];
Поскольку цикл повторяется не более 50 раз, и поскольку каждое выражение или назначение в нем является операцией с постоянным временем,
сам код является постоянным временем. Например, он содержит максимум 50 добавлений элементов массива, независимо от того, насколько велик
массив. Но следующий цикл с инициализацией не является постоянным временем, а занимает время, пропорциональное размеру b.
int sum= 0;
for (int k= 0; k < b.length; k= k 1)
sum= sum b[k];