fork download
  1. int spectrum( unsigned long *map, long N, char *file )
  2. {
  3. // В этой функции будем вычислять количество пикселей
  4. // определённого цвета в общем массиве пикселей.
  5. // Для этого создадим массив, в котором каждый элемент является
  6. // парой "цвет: сколько раз встречается".
  7. // Проверим два возможных подхода.
  8. // В первом случае попробуем считывать пиксель из карты и
  9. // проверять, записан ли он в список, если да - то инкрементируем счётчик,
  10. // если же нет - добавляем элемент в конец списка
  11. // и присваиваем счётчику значение 1.
  12. // Если количество элементов массива N, количество цветов в нём n, то
  13. // если, скажем, N = n, время выполнения можно высчитать,
  14. // исходя из того, что на первую итерацию потребуется поиск
  15. // по пустому массиву, а на итерацию i - поиск по массиву из i элементов
  16. // Т.е. за проход цикла будет перебираться до N^2 элементов (N(N+1)/2).
  17. // Если же цветов будет меньше, то сложность падает.
  18. // Во втором случае считываем пиксель из карты и проходим всю карту
  19. // в поисках таких же пикселей. Если находим такой же, инкрементируем
  20. // счёьчик, иначе - записываем элемент в новый массив.
  21. // После достижения последнего символа проходим новый массив так же.
  22. // Если элементов N и цветов n, то если N = n при первой итерации
  23. // придётся пройти N элементов, при каждой следующей N - i,
  24. // где i - номер итерации. В таком случае потребуется до N^2/2 операций.
  25. // Судя по всему, второй случай предпочтительнее,
  26. // т.к. не потребуется N раз вызывать функцию поиска по списку,
  27. // вместо этого потребуется n раз вызвать spectrum() рекурсивно,
  28. // обрабатывая массив в итоге n раз.
  29.  
  30. int i, j;
  31.  
  32. /*
  33.   ** Реализация второго случая.
  34.   */
  35.  
  36. unsigned long arr[N]; // массив, в который будем записывать новые пиксели.
  37. // понятно, что он даже чересчур большой
  38. unsigned long pix; // первый пиксель
  39. unsigned long ch = 0; // это будет счётчик
  40.  
  41. pix = map[0];
  42. j = 0;
  43. for( i = 0; i < N; i++ ){
  44. // перебираем пиксели
  45. if( map[i] != pix){
  46. // выписываем новые в заготовленный массив
  47. arr[j++] = map[i];
  48. }
  49. else
  50. // а для совпадающих инкрементируем счётчик
  51. ch++;
  52. }
  53. printf("%10x, %10li, %10li \n", pix, ch, N);
  54. // вывод вроде
  55. /*
  56.   0, 52488, 312750
  57. 1
  58. 400000, 11242, 260262
  59. 2
  60. 404040, 30558, 249020
  61. 3
  62. 40, 545, 218462
  63. 4
  64. Segmentation fault (core dumped)
  65. */
  66.  
  67. if(j > 0){
  68. printf("%d\n", k++); // выше в выводе цифры слева 1, 2, 3, 4
  69. spectrum(arr, j, file); // вызываем рекурсивно с новым списком
  70. }
  71. return 0; // просто чтобы было
  72.  
  73. /*
  74.   ** Segmentation fault для больших файлов.
  75.   ** Судя по всему, переполняется call stack
  76.   ** Либо кончается выделенная программе память, хз.
  77.   */
  78.  
  79. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function ‘spectrum’:
prog.c:53:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
     printf("%10x, %10li, %10li \n", pix, ch, N);
     ^~~~~~
prog.c:53:5: warning: incompatible implicit declaration of built-in function ‘printf’
prog.c:53:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
prog.c:53:16: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("%10x, %10li, %10li \n", pix, ch, N);
                ^
prog.c:68:24: error: ‘k’ undeclared (first use in this function)
         printf("%d\n", k++);  // выше в выводе цифры слева 1, 2, 3, 4
                        ^
prog.c:68:24: note: each undeclared identifier is reported only once for each function it appears in
stdout
Standard output is empty