Дана функция (статический метод) на языке Java:
[Given a function (static method) in java:]
static int myfunc(int[] a) {
int x = 0;
for (int i = 0; i < a.length; i++) {
for (int j = i; j < a.length; j++) {
if (a[j] != a[i]) {
if (j - i > x) {
x = j - i;
}
i = j - 1;
break;
}
}
}
return x;
}
Q: Что делает эта функция?
Q: [What does this function do?]
A: Функция ищет максимальную длину непрерывной последовательности одинаковых элементов в массиве.
A: [Function finds maximum length of continuous sequence of equals elements in given array.]
Q: Какая у неё алгоритмическая сложность?
Q: [What is its algorithmic complexity?]
A: O(n(n+1)/2) => O(n^2)
Q: Есть ли в этой функции логические дефекты? Если да, то какие?
Q: [Does this function have logical defects? If so, which ones?]
A: Да, есть:
Функция возвращает 0, если массив состоит из одинаковых элементов, в этом случае логичнее возвращать длину массива.
Не корректное определение максимальной длины последовательности при ее расположении в конце массива.
A: [Yes it has.]
[Funtion returns 0, if input array countains only equal elements. In this case is more logical to return the length of input array.]
[Incorrect calculation of maximum length of sequence, if its localted at the end of array.]
Q: Можно ли как-то улучшить данный код? Если да, напишите улучшенный вариант.
Q: [Can this code be improved? If so, write an imporev version.]
A: see https://github.com/vnmtwo/Tasks/blob/master/Tasks/ArrayOperations.cs
method: public static int MaxEqualSequenceLength<T>(T[] array)
static int myfunc(int[] a) {
int v=a[0];
int maxc=1;
int c=1;
for (int i=1; i<a.length; i++){
if (a[i]==v) c++;
else{
v=a[i];
if (maxc<c) maxc=c;
c=1;
}
}
if (maxc>c) return maxc;
else return c;
}
Q: Какая алгоритмическая сложность у вашего варианта?
Q: [What is the algoritmic complexity of your version?]
A: O(n)