Re[12]: Решение за O(N) и доп. память O(N)
От: Аноним  
Дата: 22.07.11 10:44
Оценка:
Здравствуйте, Xobotik, Вы писали:

X>Здравствуйте, OlegMax, Вы писали:


OM>>Попробуем мысленно прогнать на последовательности {3,3}. Получим "index out of bounds".


X>Ну тогда буферный массив будет выглядеть следующим образом:

X>
X>int[] buf = new int[array.Max() + 1];
X>


Что за чушь? Пусть array.Max() == 0xFFFFFFFF
Дальше что?
Re: Поиск повторяющегося числа в массиве
От: SergeySymbol Россия  
Дата: 29.07.11 10:19
Оценка: -1
Здравствуйте, Xobotik, Вы писали:

X>Условие задачи:

X>Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно
X>число в этом массиве повторяется два раза. Найти это число за время O(N).

X>Реализация:

X>
X>private static string separator = ";";
X>        static void Main(string[] args)
X>        {
X>            int[] result = GetIntArray(InputArray());
X>            PrintArray(result);
X>            Console.WriteLine(ff(result));
X>            Console.ReadLine();
X>        }
X>        private static string InputArray()
X>        {
X>            Console.WriteLine("Введите массив, содержащий только целые числа.");
X>            Console.WriteLine("После каждого числа ставьте разделитель '{0}'", separator);
X>            Console.WriteLine("Введите массив: ");
X>            return Console.In.ReadLine();
X>        }
X>        private static int[] GetIntArray(string insert)
X>        {
X>            string pattern = String.Format("{0}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))", separator);
X>            string[] bufResult = Regex.Split(insert, pattern);
X>            int[] result = new int[bufResult.Length];
X>            for (int i = 0; i < bufResult.Length; i++)
X>            {
X>                result[i] = Int32.Parse(bufResult[i]);
X>            }
X>            return result;
X>        }
X>        private static void PrintArray(int[] array)
X>        {
X>            foreach(int i in array)
X>            {
X>                Console.WriteLine(i);
X>            }
X>        }
X>        private static int ff(int[] array)
X>        {
X>            int m = 1;
X>            int buf = 0;
X>            // общее количество сравнений (n-1)^2, где n - длина массива
X>            for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)
X>            {
X>                // количество перестановок (n-1) = количеству сравнений array[0] и array[k], где k - числа от 1 до n (n - длина массива)
X>                for (int j = 1; j < array.Length; j++)
X>                {
X>                    if (array[0] == array[j])
X>                    {
X>                        buf = array[0];
X>                        goto result;
X>                    }
X>                }
X>                Swap(array, m);
X>                m++;
X>            }
X>        result:
X>        return buf;
X>        }
X>        private static void Swap(int[] array, int index)
X>        {
X>            int temp = array[index];
X>            array[index] = array[0];
X>            array[0] = temp;
X>        }
X>


X>Есть ли какие-либо другие пути решения задачи? Без goto не вижу решения задачи, если использовать break, там где buf = array[0] , останавливается только цикл:


X>
X>for (int j = 1; j < array.Length - 1; j++)
X>


X>при этом работа цикла


X>
X>for (int i = 0; i < (array.Length - 1) * (array.Length - 1); i++)
X>


X>не прерывается


X>Заранее спасибо!


Реализация на с
int Find(int * Array,int N, int M)
{
    int *AsPresent = new int[M];
    memset(AsPresent,0,sizeof(int)*M);
    for(int i=0;i<N;i++)
        if(AsPresent[Array[i]])
        {
            delete[] AsPresent;
            return Array[i];
        }
        else
            AsPresent[Array[i]] = 1;
        delete[] AsPresent;
    return -1;
}
Re[2]: Поиск повторяющегося числа в массиве
От: opener  
Дата: 30.07.11 21:31
Оценка:
Здравствуйте, SergeySymbol, Вы писали:


SS>Реализация на с

SS>
SS>int Find(int * Array,int N, int M)
SS>{
SS>    int *AsPresent = new int[M];
SS>    memset(AsPresent,0,sizeof(int)*M);
SS>    for(int i=0;i<N;i++)
SS>        if(AsPresent[Array[i]])
SS>        {
SS>            delete[] AsPresent;
SS>            return Array[i];
SS>        }
SS>        else
SS>            AsPresent[Array[i]] = 1;
SS>        delete[] AsPresent;
SS>    return -1;
SS>}
SS>


Клево.
Особенно умиляет количество памяти, которое необходимо выделить, для такого, к примеру, массива:

int Array[] = { 1, 1, 0xFFFFFFFF };
Re[6]: Поиск повторяющегося числа в массиве
От: opener  
Дата: 31.07.11 07:27
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, samius, Вы писали:


S>>Здравствуйте, vsb, Вы писали:


vsb>>>Здравствуйте, samius, Вы писали:


S>>>>Здравствуйте, vsb, Вы писали:


vsb>>>>>Здравствуйте, Xobotik, Вы писали:


vsb>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз.

S>>>>int[] a = { 1, 3, 2, 1, 4 };
S>>>>выдает 4

vsb>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.


S>>Вы условие задачи читали? Числа от 1-го до M!


vsb>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.


Никто и не придирается. Просто твое решение неправильное, вот и все.
Re[7]: Поиск повторяющегося числа в массиве
От: vsb Казахстан  
Дата: 31.07.11 15:40
Оценка:
Здравствуйте, opener, Вы писали:

O>Здравствуйте, vsb, Вы писали:


vsb>>Здравствуйте, samius, Вы писали:


S>>>Здравствуйте, vsb, Вы писали:


vsb>>>>Здравствуйте, samius, Вы писали:


S>>>>>Здравствуйте, vsb, Вы писали:


vsb>>>>>>Здравствуйте, Xobotik, Вы писали:


vsb>>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз.

S>>>>>int[] a = { 1, 3, 2, 1, 4 };
S>>>>>выдает 4

vsb>>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.


S>>>Вы условие задачи читали? Числа от 1-го до M!


vsb>>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.


O>Никто и не придирается. Просто твое решение неправильное, вот и все.


На каких входных данных моё решение даёт неверный ответ?
Re[3]: Поиск повторяющегося числа в массиве
От: SergeySymbol Россия  
Дата: 01.08.11 08:01
Оценка:
Здравствуйте, opener, Вы писали:

O>Здравствуйте, SergeySymbol, Вы писали:



SS>>Реализация на с

SS>>
SS>>int Find(int * Array,int N, int M)
SS>>{
SS>>    int *AsPresent = new int[M];
SS>>    memset(AsPresent,0,sizeof(int)*M);
SS>>    for(int i=0;i<N;i++)
SS>>        if(AsPresent[Array[i]])
SS>>        {
SS>>            delete[] AsPresent;
SS>>            return Array[i];
SS>>        }
SS>>        else
SS>>            AsPresent[Array[i]] = 1;
SS>>        delete[] AsPresent;
SS>>    return -1;
SS>>}
SS>>


O>Клево.

O>Особенно умиляет количество памяти, которое необходимо выделить, для такого, к примеру, массива:

O>
O>int Array[] = { 1, 1, 0xFFFFFFFF };
O>

Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N).
если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).
Re[4]: Поиск повторяющегося числа в массиве
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 01.08.11 08:15
Оценка:
Здравствуйте, SergeySymbol, Вы писали:

SS>Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N).

SS>если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).

Как это "не считать"? Инициализация этой памяти займёт O(M), а значит сложность будет O(M+N).
Ce n'est que pour vous dire ce que je vous dis.
Re[5]: Поиск повторяющегося числа в массиве
От: SergeySymbol Россия  
Дата: 01.08.11 09:00
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, SergeySymbol, Вы писали:


SS>>Приведенный массив не соответствует условию задачи поскольку ты скорее всего имел ввиду int 32 разрядный целочисленный знаковый тип то значение 0xFFFFFFFF будет интерпретировано как -1, а в условии от 1 до M. Да слабость этого алгоритма в выделении дополнительной памяти, а так если не считать memset(AsPresent,0,sizeof(int)*M) то он удовлетворяет условию O(N).

SS>>если использовать в качестве словаря контейнеры на основе бинарных деревьев , то сложность будет O(N*log(N)).

DR>Как это "не считать"? Инициализация этой памяти займёт O(M), а значит сложность будет O(M+N).

так я это и указал.
Re[8]: Поиск повторяющегося числа в массиве
От: opener  
Дата: 20.08.11 16:59
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>На каких входных данных моё решение даёт неверный ответ?


Не знаю (лень думать). Это не то решение, которое нужно было найти.
Re[8]: Поиск повторяющегося числа в массиве
От: opener  
Дата: 20.08.11 17:01
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, opener, Вы писали:


O>>Здравствуйте, vsb, Вы писали:


vsb>>>Здравствуйте, samius, Вы писали:


S>>>>Здравствуйте, vsb, Вы писали:


vsb>>>>>Здравствуйте, samius, Вы писали:


S>>>>>>Здравствуйте, vsb, Вы писали:


vsb>>>>>>>Здравствуйте, Xobotik, Вы писали:


vsb>>>>>>>Если M < N, то вот решение. Не выделяет лишней памяти, не изменяет исходный массив. Печатает одно из чисел, которые повторяются 2 или более раз.

S>>>>>>int[] a = { 1, 3, 2, 1, 4 };
S>>>>>>выдает 4

vsb>>>>>N = 5, M = 5, условие не удовлетворено. В общем цифры надо считать с нуля. Если каждое число в вашем примере уменьшить на единицу, то всё работает.


S>>>>Вы условие задачи читали? Числа от 1-го до M!


vsb>>>Не придирайтесь Пусть будут от 0 до M-1, это ничего не изменит, если надо для исходной задачи — просто -1 написать в некоторых местах.


O>>Никто и не придирается. Просто твое решение неправильное, вот и все.


vsb>На каких входных данных моё решение даёт неверный ответ?


На таком массиве что получится?

int arr[3] = { 1, 1, MAX_INT };
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.