Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2016, 14:40   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте такой код:

Код:
#include <iostream>
#include "fstream"
using namespace std;

int different_numbers(int n, int *a) {
	int i, j, kol = 1;
	for (i = 0; i<n - 1; i++) {
		if((i>0)&&(a[i]==a[0])) continue;
		for (j = i + 1; j<n; j++) {
			if (a[i] == a[j]) { a[j]=a[0]; break; }
		}
		if (j == n) kol++;
	}
	return kol;
}
int main() {
	int n, i, kol;
	ifstream f("input.txt");
	ofstream f1("output.txt");
	f >> n;
	int* a;
	a = new int[n];
	for (int i = 0; i < n; i++)
		f>> a[i];
	kol=different_numbers(n, a);
	f1<< kol;
 
	return 0;
}
p.s. эта попытка реализации той же самой идеи, что предложил evg_m - исключить поиск для элементов, которые ранее были найдены, как неуникальные.

Последний раз редактировалось Serge_Bliznykov; 22.09.2016 в 14:50.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.09.2016, 14:50   #12
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию

К сожалению не помогло.
Не подскажите, а этот код как оптимизировать? Может так работать будет быстрее.
Код:
#include <iostream>
#include "fstream"
using namespace std;
 
 
int main()
{
    ifstream f("input.txt");
    ofstream f1("output.txt");
    int i, n, j, kol = 1;
    f>> n;
    int* a;
    a = new int[n];
    for (i = 0; i < n; i++) {
        f>> a[i];
    }
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (a[j] > a[j + 1]) {
                swap(a[j], a[j + 1]);
                
            }
 
        }
    }
    kol = n > 0 ? 1 : 0;
    for (i = 1; i < n; i++)
        if (a[i] != a[i - 1])
            kol++;
    f1 << kol;
ShuricFC вне форума Ответить с цитированием
Старый 22.09.2016, 14:57   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
К сожалению не помогло.
ну, тогда я пас...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.09.2016, 15:13   #14
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Похоже evg_m уже писал об этом (в п.1), но у тебя нет никакой реакции на этот счет, - а ведь это важно! Это может существенно ускорить работу программы (я продублирую) ...

В настройках моего компилятора есть возможность оптимизации кода либо по объёму, занимаемой в памяти программы, либо по скорости работы этой самой программы. Понимаешь, есть обратная связь память/скорость.

34.jpg

А теперь к твоей программе: когда выделяешь динамическую память ("a = new int[n];") под данные ты явно (может не осознанно) пытаешься экономить оперативную память компьютера (в ущерб быстродействию), т.к. выделяешь её строго под данные - ни одного байта больше. А ты хоть знаешь сколько времени эта операция осуществляется?...

Может лучше использовать статическое резервирование памяти под массив: "int a[100]", "int a[1000]", "int a[10000]".... Посмотри какая расточительность памяти компьютера. Класс, ведь чем больше займешь памяти - тем быстрее будет работать программа (помнишь выше изложенную закономерность).

Последний раз редактировалось ura_111; 22.09.2016 в 15:15.
ura_111 вне форума Ответить с цитированием
Старый 22.09.2016, 15:20   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

если уж не хотите делать ВТОРОЙ массив, то могу предложить другую идею.

уменьшить длину просмотра для поиска уникальных.
Для этого собИрать все уникальные в начало.
Код:
unique:=0; //вначале уникальных нет (нет есть! первый(нулевой) всегда уникален)
for i:=unique+1 to n do
  // далее ПРОВЕРЯЕМ НАЧАЛО(уже просмотренные) списка на наличие 
  noignore:=-1;
  for j:=0 to unique do 
     if a[i]=a[j] then begin noignore:=j; break; end;

  if  noignore>=0 then begin //АГА встретили новый
    unique:=unique+1; a[unique]:=a[noignore];
  end;
end;
P.S. это конечно же не С, но ...

Да, и на массиве с большим числом неповторяемости вряд ли пройдет тесты.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.09.2016, 15:35   #16
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию

Всем большое спасибо! Проблема решена!
ShuricFC вне форума Ответить с цитированием
Старый 22.09.2016, 16:18   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ShuricFC Посмотреть сообщение
Всем большое спасибо! Проблема решена!
ну и как решена? Расскажите, любопытно же!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.09.2016, 16:28   #18
ShuricFC
Пользователь
 
Регистрация: 17.09.2016
Сообщений: 25
По умолчанию

Помогла быстрая сортировка и один проход по циклу.
ShuricFC вне форума Ответить с цитированием
Старый 22.09.2016, 16:45   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ShuricFC Посмотреть сообщение
Помогла быстрая сортировка и один проход по циклу.
Это удивительно - на сортировку должно уходить больше времени, чем на простой перебор, но, раз у Вас всё получилось, то поздравляю!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.09.2016, 20:59   #20
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

У тебя сложность n^2 в начальном варианте. То есть, ты за O(n) выбираешь первые элементы, а потом за O(n) ищешь его копии. Это медленно.

Вариант с быстрой сортировкой лучше, так как ты сортируешь за O(n log n), а потом за O(n) ищешь числа. В итоге получается O(n log n).

Есть такой вариант, он лучше всего, так как там нет утечки памяти, как у тебя, да и работает он за O(n), так как проверка наличия и добавление элементов в хэш-таблицу работает за константу:
Код:
#include <unordered_set>
...

        f >> n;
	std::unordered_set<int> uniq, not_uniq;
	for (int i = 0; i < n; i++){
                int tmp;
		f>> tmp;
                if(uniq.find(tmp)!=uniq.end())// неуникальное число
                {
                     uniq.erase(tmp);
                     not_uniq.insert(tmp);
                }
                if(not_uniq.find(tmp)==not_uniq.end()){ // уникальное число
                      uniq.insert(tmp)
                }
        }
	
        f1<<uniq.size();
 
	return 0;
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод различных элементов массива. pirat2k Общие вопросы C/C++ 5 24.03.2016 17:10
подкорректировать: Дан массив, все элементы которого упорядочены. Найти количество различных элементов в данном массиве ( Delphi ) schibeki Помощь студентам 9 20.02.2014 09:39
Дан массив A[7,7]. Найти количество столбцов, составленных из попарно различных элементов (Pascal) yul111-95 Паскаль, Turbo Pascal, PascalABC.NET 0 02.02.2013 22:01
Сумма различных элементов массива bin11 Помощь студентам 0 21.05.2012 15:30
В массиве из п элементов много совпадающих элементов. Найти количество различных элементов Strax Фриланс 11 12.06.2010 20:13