Это 16-й день, когда я участвую в Gengwen Challenge, проверьте подробности мероприятия:Обновить вызов
Преамбула
Хотя я много лет занимаюсь кодированием, я все еще чувствую себя далеким от себя, когда дело доходит до алгоритмов: кажется, что не существует алгоритма для написания программ, способных удовлетворить потребности пользователей. Однако в последнее время я чувствую, что трудно стать лучше, если я буду продолжать в том же духе, поэтому я готов приступить к чистке вопросов.
Я начал решать некоторые вопросы LeetCode и почувствовал себя немного беспомощным и подавленным. С этой целью я решил начать с основ, сначала взглянув на структуру данных. Тогда наш алгоритм будет не только реализовывать некоторые методы, но и учитывать уничтожение временных и пространственных ресурсов.
Основная информация
Классификация | содержание |
---|---|
Частота обновления | ежедневно (по возможности) |
язык | python /java |
Область применения | интервью |
что такое алгоритм
алгоритм(Алгоритм) относится к набору методов, используемых для обработки данных и решения программных проблем. Для одного и того же вопроса может быть много разных алгоритмов, чтобы дать правильный ответ, но ресурсы и время, затраченные на этот процесс, будут сильно различаться. Это и есть цель нашего алгоритма исследования.
временная сложность и пространственная сложность
- временная сложность: относится ко времени, затраченному на выполнение текущего алгоритма.
- космическая сложность: указывает, сколько памяти требуется для выполнения текущего алгоритма.
Поэтому оценка эффективности алгоритма в основном зависит от его временной и пространственной сложности. Однако иногда время и пространстворыба и медвежьи лапы, не может иметь и то, и другое, то нам нужно получить от него точку баланса.
язык
Будьте готовы предоставить решения проблем на этих языках.
- javascript
- java
- python
- go
- rust
- cpp
временная сложность
Когда я обычно оптимизирую код, я обычно вывожу время до и после сегмента кода, чтобы рассчитать время, затрачиваемое методом, думая, что это время, затрачиваемое алгоритмом. Однако предпосылка нашей оптимизации заключается в том, что мы используем ту же аппаратную конфигурацию, потому что этот алгоритм в большей степени связан с аппаратной поддержкой. Фактически, у нас есть набор шкал для измерения нашего алгоритма.
Так появился другой, более общий подход: **Большая нотация O**, т.е. T(n) = O(f(n))
const n = 10;
var j = 0;
for(let i=1; i<=n; ++i)
{
j = i;
j++;
}
пройти черезОбозначение большого O, временная сложность этого кода: O(n), почему?
шкала сложности
Общие показатели временной сложности:
- Постоянный порядок O(1)
- Логарифмический O(logN)
- Линейный порядок O (n)
- Линейный логарифмический порядок O(nlogN)
- Квадратный порядок O (n²)
- Кубический порядок O (n³)
- Порядок степени K O (n ^ k)
- Экспоненциальный порядок (2^n)
const N = 10;
var a = 0;
var b = 0;
for (let i = 0; i < N; i++) {
a = a + Math.random() // $N \times 1$ 操作 = O(N)
}
измерение | ценность |
---|---|
временная сложность | O(N) |
космическая сложность | O(1) |
for (let i = 0; i < N; i++) {
a = a + Math.random() // $N \times 1$ 操作 = O(N)
b = b + Math.random() // $N \times 1$ 操作 = O(N)
}
измерение | ценность |
---|---|
временная сложность | O(N) + O(N) = O(N) |
космическая сложность | O(1) |
for (let i = 0; i < N/2; i++) {
b = b + Math.random() // $ \frac{1}{2} N \times 1$ 操作 = O(N)
}
измерение | ценность |
---|---|
временная сложность | |
космическая сложность | O(1) |
Пространственная сложность равна O(1), потому что она не зависит от N, так что это постоянная сложность.
for (let i = 0; i < N; i++) {
for (let j = N; j > i; j--) {
a = a + i + j;
}
}
Самый простой и эффективный способ — перечислить каждый шаг один за другим, а затем обобщить правила для решения проблемы.
i = 0: j = N...1 (N)
i = 1: j = N...2 (N-1)
i = 3: j = N...3 (N-2)
i = N-1: j = N (1)
временная сложность, потому чтоСложность строго больше, чемсложность
измерение | ценность |
---|---|
временная сложность | |
космическая сложность | |
``` | |
var a = 0; | |
var i = N; |
в то время как (я > 0) { а += i;//1 операция я /= 2;//1 операция }
在算法中,**时间复杂度**度是一个单位,而不是具体用的时间,这一点希望大家一定要清楚,我们通过不同量级(单位)来衡量单位。例如我们平时使用时间单位,时、分和秒,而不是具体用了几个小时。
而不是具体给出某一个算法具体耗时。这一点对于初学者可能是比较confusing
### 常数阶 $O(1)$
```python
console.log("hello world")
Операция, выполненная здесь,Постоянная операция, выдающая HelloWorld только три раза, считаетсяЗдесь 1 означает постоянную единицу, а не значение конкретного числа 1.
Линейный порядок
var N = 10;
for(let i = 0; i < N; i++){
console.log("hello world");
}
Здесь есть цикл, который говорит, что выполнение операции вывода helloWord связано с N, поэтому запишите его как
Квадратный порядок
for(let i =0; i < N; i++){
for(let j=0; j< N; j++){
console.log(i)
}
}
кубический порядок
for(let i =0; i < N; i++){
for(let n=0; n< N; n++){
for(let m =0; m < N; m++){
console.log(i)
}
}
}
Теперь нетрудно обнаружить, что слоев цикла for несколько, а временная сложность в несколько раз больше n.
логарифмический
var N = 32
while(N > 0){
console.log("hello world")
N = N/2
}
Вот одна вещь, которую мы хотим сказать, а именно этонамного меньше, чемпока мы помним
var N = 100
for(let i=1; i<N; i++)
{
i = 1;
while(i<N)
{
i = i * 2;
}
}