Змінюй хід війни! Допомагай ЗСУ!

Массив

  • Автор теми Автор теми ligorl
  • Дата створення Дата створення
В интернете сотни решений, какое из них твое? Или может ты автор всех решений?

а тебе именно мое нужно? или любое правильное? ты типа мой первый фанат?

У тебя комплекс неполноценности?

****о смотрит на меня и думает что в зеркало.
 
imho, балаболы не в состоянии подтвердить свои слова. ТС попросил поделиться алгоритмом поиска уникальных символов в строке. Ты выкатываешь свои "подсказки", к которым у меня возник интерес, о чем я и сказал. Если не в состоянии нормально ответить на вопрос, то не отвечай. Что за манера общения такая?

****о смотрит на меня и думает что в зеркало.
Не вижу смысла продолжать диалог с невоспитанным хамом.
 
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


вот пример решения аналогичных заданий гистограммой...



ТС попросил поделиться алгоритмом поиска уникальных символов в строке.

Ты ******иваешься или такой на самом деле?? Я в первом посте сказал что уникальные символы в гистограмме равны 1. Берешь массив размерностью алфавита. И каждый раз когда встречаешь символ код которого равен предположим единице и первый элемент массива инкриминируешь и так далее. И так до последнего элемента строки. Дальше продолжать?
 
Останнє редагування:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int const gLoopCount = 1000000;

typedef int(*TTestProc)(char* aString);

int getUniqueCharsCount1(char* aString) {
  int lResult = 0;
  int lIndex;
  int lStringLen  = strlen(aString);
  for (lIndex = 0; lIndex < lStringLen; lIndex++) {
    if (strchr(aString, aString[lIndex]) == &aString[lIndex]) {
      //putchar(aString[lIndex]);
      lResult++;
    }
  }
  return lResult;
}

int getUniqueCharsCount2(char* aString) {
  int lResult = 0;
  int lIndex;
  int lStringLen  = strlen(aString);
  int lCharSize = sizeof(char);
  int lBufferLength = 0;
  char* lBuffer = (char*) calloc(256, lCharSize);

  for (lIndex = 0; lIndex < lStringLen; lIndex++) {
    if (!strchr(lBuffer, aString[lIndex])) {
      memset(&lBuffer[lBufferLength++], aString[lIndex], lCharSize);
    }
  }
  //printf(lBuffer);
  free(lBuffer);
  return lResult;
}

int getUniqueCharsCount3(char* aString) {
  int lResult = 0;
  int lIndex;
  int lStringLen = strlen(aString);
  unsigned int* lBuffer = (unsigned int*) calloc(256, sizeof(unsigned int));
  for (lIndex = 0; lIndex < lStringLen; lIndex++) {
    lBuffer[aString[lIndex]]++;
  }
  for (lIndex = 0; lIndex < 256; lIndex++) {
    if (lBuffer[lIndex]) {
      //putchar(lIndex);
      lResult++;
    }
  }
  free(lBuffer);
  return lResult;
}

int getUniqueCharsCount4(char* aString) {
  int lResult = 0;
  int lIndex;
  int lStringLen = strlen(aString);
  unsigned int* lBuffer = (unsigned int*) calloc(256, sizeof(unsigned int));
  for (lIndex = 0; lIndex < lStringLen; lIndex++) {
    if (!lBuffer[aString[lIndex]]) {
      lBuffer[aString[lIndex]]++;
      //putchar(aString[lIndex]);
      lResult++;
    }
  }
  free(lBuffer);
  return lResult;
}

void executeTestFunction(TTestProc aFunction, char* aString, char* aFunctionName) {
  clock_t lClock = clock();
  int lIndex;
  for (lIndex = 0; lIndex < gLoopCount; lIndex++) {
    aFunction(aString);
  }
  printf("\n%s: elapsed time is %d ticks\n", aFunctionName, clock() - lClock);
  return;
}

int main(int argc, char *argv[]) {
  if (argc > 1) {
    executeTestFunction(getUniqueCharsCount1, argv[1], "getUniqueCharsCount1");
    executeTestFunction(getUniqueCharsCount2, argv[1], "getUniqueCharsCount2");
    executeTestFunction(getUniqueCharsCount3, argv[1], "getUniqueCharsCount3");
    executeTestFunction(getUniqueCharsCount4, argv[1], "getUniqueCharsCount4");
  }
  return 0;
}

Вот небольшое сравнение алгоритмов.



И полученные результаты.
Код:
v0id@faceless:~>./test "aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffaaaaaaaaaaaaaaaaaaavvvvvvvvvvvvvvvvvvvvvffffffffffffffffffffffffse1231231435r8gudfjghsdfasfksdf"
getUniqueCharsCount1: elapsed time is 10310000 ticks
getUniqueCharsCount2: elapsed time is 3440000 ticks
getUniqueCharsCount3: elapsed time is 2160000 ticks
getUniqueCharsCount4: elapsed time is 1580000 ticks

v0id@faceless:~>./test "Magic. Do not touch."
getUniqueCharsCount1: elapsed time is 410000 ticks
getUniqueCharsCount2: elapsed time is 410000 ticks
getUniqueCharsCount3: elapsed time is 1120000 ticks
getUniqueCharsCount4: elapsed time is 290000 ticks

Третий вариант алгоритма (по твоим словам сделано. можешь предложить свой вариант в виде кода) показывает среднее время на большой строке с большим количеством повторяющихся символов, а на маленькой строке с малым количеством повторяющихся символов совсем много времени тратит.

Я в первом посте сказал что уникальные символы в гистограмме равны 1. Берешь массив размерностью алфавита. И каждый раз когда встречаешь символ код которого равен предположим единице и первый элемент массива инкриминируешь и так далее. И так до последнего элемента строки. Дальше продолжать?

Почитай тоже внимательно условие задачи. Твой алгоритм будет выводить символы, которые встречаются в строке только один раз, а в задаче написано, что
|a|b|c|b|a|a|c|d|
результат выше приведенного примера должен вывести
4
тоесть a b c d



jammer77, чего притих?
 
Останнє редагування:
это задание на диплом?
 
А какова цель?
Максимум быстродействия?
Минимум кода?
Минимум занимаемых ресурсов?
Новый неизвестный науке алгоритм?
 
А че, кароче за лабу одногрупнику дать 20-30 грн уже не модна?
 
Ты мне? Я все делаю сам + мне дают 20-30 гривен... Повторюсь, я не ТС и это не мое задание.

Шо ж ты такой самокритичный :) Вообще-то я ТСу ибо тема уныла как гавно после пъянки....
З.Ы. Настаяющие пацаны впердолили бы сие в один несчастны ДВОРД или КуВОРД :)
 
Назад
Зверху Знизу