13 Mart 2019 Çarşamba

STL Döndürme (Rotate) Algoritmaları

Giriş
STL algoritmalarını işlevlerine göre gruplamak anlamayı çok daha kolaylaştırıyor. Aşağıdaki algoritmalar dizileri döndürmeyi gösteriyor.

Genel Kural
Rotate algoritmalarında genel kural şöyledir
public static IEnumerable<T> Shift<T>(this T[] source, int count)
{
  for (int i = 0; i < source.Length; i++)
  {
    var j =
      count > 0
      ? (i + count) % source.Length
      : (i + count + source.Length) % source.Length;
    yield return source[j];
  }
}

std::rotate metodu
İlk parametre rotate işleminin hangi kaynak nesneden başladığını belirtir.
İkinci parametre rotate işleminin hangi kaynak nesnede biteceğini belirtir.
Üçüncü parametre rotate işleminin hangi hedef nesneden başlayacağını belirtir.

Örnek
C# ile şöyle yaparız. temp[] dizisine rotate edilecek elemanlar kopyalanır. Sonre gelene elemenlar baştakileri ezer, En son temp tekrar kopyalanır.
public static int[] rotLeft(int[] a, int d)
{
  int[] temp = new int[d];

  for (int i = 0; i < d; i++)
    temp[i] = a[i];

  for (int i = d; i < a.Length; i++)
  {
    a[i - d] = a[i];
  }

  for (int i = 0; i < d; i++)
    a[a.Length - d + i] = temp[i];

  return a;
}
Örnek
İlk rakamı en sona almak istersek şöyle yaparız.
unsigned long long n = 1934;
std::string s = std::to_string(n);
std::rotate(s.begin(), s.begin() + 1, s.end()); // left rotation
n = std::stoull(s);
std::cout << n; // 9341
Örnek
Şöyle yaparız.
std::rotate(l.begin(), std::next(l.begin()), l.end());
std::rotate_copy metodu
Açıklaması şöyle.
if 2 left rotations are performed on array [1,2,3,4,5], then the array would become [3,4,5,1,2]
Örnek
C# ile şöyle yaparız. d parametresi kaç defa rotate edileceğini belirtir.
public static int[] rotLeft(int[] a, int d)
{
  int[] result = new int[a.Length];

  for (int i = d; i < a.Length; i++)
  {
    result[i - d] = a[i];
  }

  for (int j = 0; j < d; j++)
  {
    result[a.Length - d + j] = a[j];
  }

  return result;
}


Hiç yorum yok:

Yorum Gönder