11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
1

Два практически идентичных кода, но один почему-то работает медленней

17.07.2017, 20:33. Показов 561. Ответов 4
Метки нет (Все метки)

Почему мой код работает намного медленнее? Ведь по сути одно и то же!

Мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int ans = 0;
  set<int> check;
  for (set<int>::iterator it = val.begin(); it != val.end(); it++) { //val - сет
    for (int j = 0; j < k; j++) {
      check.insert(*it + a[j]); //a - вектор
    }
    for (set<int>::iterator it2 = b.begin(); it2 != b.end(); it2++) {//b - сет
      if (check.find(*it2) == check.end()) {
        ans--;
        break;
      }
    }
    ans++;
    check.clear();
  }
Чужой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set<int> p2;
   int ans = 0;
   for (auto p : points) { //points  - сет
      p2.clear();
      for (int i=1; i<=k; i++) {
         p2.insert(p+s[i]); //s - вектор 
      }
      int j=1;
      bool vf = true;
      while (j<=n and vf) {
         vf = false;
         if (p2.find(b[j]) != p2.end()) { //b - вектор
            vf = true; 
         }
         j++;
      }
      ans += vf;
   }
Тут только основная рабочая часть. Остальной код, хоть и небольшой, я не стал скидывать, чтобы вам было легче разобраться, но если надо - скину.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2017, 20:33
Ответы с готовыми решениями:

Два идентичных куска кода работают по-разному
Разбираю чужой код. В одном случае $realty = new Realty(); $ass_user = new User(); ...

Из двух идентичных запросов работает один
Всем привет. Вот у меня есть такое: &lt;tr&gt; &lt;td&gt;Организация, в которой состоит на учете&lt;/td&gt; &lt;td&gt;...

Два примера на XSLT. Один работает, другой нет. Почему?
Есть у меня 2 похожих примера. Но один работает, а другой нет. Объясните почему. Как сделать, чтобы...

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

4
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
17.07.2017, 20:51 2
Только из-за замены vector на set?
0
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
17.07.2017, 21:10  [ТС] 3
nmcf, я тоже так подумал, хотя это и странно: не может же программа работать в два раза медленнее просто из-за того, что вектор сменили на сет. Я пробовал менять, результат тот же.
0
7084 / 6085 / 2774
Регистрация: 14.04.2014
Сообщений: 26,174
17.07.2017, 21:28 4
Количество элементов одинаковое в обоих вариантах? Может, проблема вообще не здесь?
0
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
17.07.2017, 22:59  [ТС] 5
nmcf, ну конечно одинаковое. Сейчас скину полностью коды.

Чужой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
   int   n, k;
   vector<int>    a, b;
   cin >> k >> n;
   a.assign(k+1, 0);
   for (int i=1; i<=k; i++) {
      cin >> a[i];
   }
   b.assign(n+1, 0);
   for (int i=1; i<=n; i++) {
      cin >> b[i];
   }
 
   vector<int> s(k+1, 0);
   for (int i=1; i<=k; i++) {
      s[i] = s[i-1] + a[i];
   }
 
   set<int> points;
   for (int j=1; j<=k; j++) {
      points.insert(b[1] - s[j]);    
   }
 
   set<int> p2;
   int ans = 0;
   for (auto p : points) {
      p2.clear();
      for (int i=1; i<=k; i++) {
         p2.insert(p+s[i]);
      }
      int j=1;
      bool vf = true;
      while (j<=n and vf) {
         vf = false;
         if (p2.find(b[j]) != p2.end()) {
            vf = true; 
         }
         j++;
      }
      ans += vf;
   }
 
   cout << ans << endl;
 
   return 0;
}
Мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>
 
using namespace std;
 
 
vector<int> a;
set<int> val, b;
int k, n;
 
int main () {
  cin >> k >> n;
  a.resize(k, 0);
  cin >> a[0];
  for (int i = 1; i < k; i++) {
    cin >> a[i];
    a[i] += a[i-1];
  }
  for (int i = 0; i < n; i++) {
    int tmp;
    cin >> tmp;
    b.insert(tmp);
  }
  for (set<int>::iterator it = b.begin(); it != b.end(); it++) {
    for (int j = 0; j < k; j++) {
      val.insert(*it - a[j]);
    }
  }
  int ans = 0;
  set<int> check;
  for (set<int>::iterator it = val.begin(); it != val.end(); it++) {
    for (int j = 0; j < k; j++) {
      check.insert(*it + a[j]);
    }
    for (set<int>::iterator it2 = b.begin(); it2 != b.end(); it2++) {
      if (check.find(*it2) == check.end()) {
        ans--;
        break;
      }
    }
    ans++;
    check.clear();
  }
  cout << ans << endl;
  return 0;
}
Добавлено через 1 час 22 минуты
Проблема решена. Вот тут наши программы различались.
C++
1
2
3
4
set<int> points;
   for (int j=1; j<=k; j++) {
      points.insert(b[1] - s[j]);    
   }
C++
1
2
3
4
5
for (set<int>::iterator it = b.begin(); it != b.end(); it++) {
    for (int j = 0; j < k; j++) {
      val.insert(*it - a[j]);
    }
  }
Здесь нужен был один цикл, я недоглядел в задаче.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2017, 22:59

Почему не работает таймер в практически бесконечном цикле?
Вобщем код такой. procedure TForm1.Timer1Stop(Sender: TObject); begin //procedure ...

Почему странички браузера стали медленней открываться
помимо того что тормозит они ещё во время перехода снизу вверх по возрастающей смена страниц идет...

Один в один как в образце, но у меня почему-то не работает, пожалуйста выручите!
Не получается сделать пример из лабораторной, что я делаю не так?

64-битная работает медленней 32-битной
Добрый вечер, после установки windows 7 64-битной компьютер стал слишком медленно работать по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.