Sağa ve sola doğru bir yer N konumuna göre kaydırmalıyım.C# 'de hızlı dizi kaydırma uygulaması?
Kaydettiğim tarafta çıkan öğeler diğer tarafa geri dönmelidir. Sağ 13 ile
Shift: 15 tarafından bırakılan
[0,1,2,3,4,5,6,7,8,9] -> [7,8,9,0,1,2,3,4,5,6]
Shift: Bu işlem milyonlarca kez olacak ve gerçekten hızlı olmalı
[0,1,2,3,4,5,6,7,8,9] -> [5,6,7,8,9,0,1,2,3,4]
.
Geçerli uygulamam aşağıdaki gibidir. Yapılacak bir optimizasyon varsa lütfen bir göz atın ve önerin.
if (shift > 0)
{
int offset = array.Length % shift;
if (offset > 0)
{
byte[] temp = new byte[offset];
if (!right)
{
Array.Copy(array, temp, offset);
Array.Copy(array, offset, array, 0, array.Length - offset);
Array.Copy(temp, 0, array, array.Length - offset, temp.Length);
}
else
{
Array.Copy(array, array.Length - offset, temp, 0, offset);
Array.Copy(array, 0, array, offset, array.Length - offset);
Array.Copy(temp, 0, array, 0, temp.Length);
}
}
}
o kaymıştır alacak miktarına bir ipucu olarak
(ama optimizasyon yol açabilir şüphe):
- depends on the entropy of the array itself
- for aray that are full of same values it will get shifted roughtly 0
- more entropy means higher shift value
- direction of shift will be used generally more to the left
PS. Güvenli olmayan kod çalıştırmak için güvenlik izni alınamıyor:/
PS2: Ortaya çıkan dizi, ileri işleme için farklı bir kitaplığa doğru bir dizi olarak geçirilmelidir, bu yüzden yalnızca sarmak ve yeniden dizine sığamıyorum.
PS3: Yöntem, ref
yöntemini kullandığı için aynı dizide çalışmayı tercih ediyorum ve bunu yeni bir dizide yapıyor ve sonra da kopyalama işlemi zaman alacaktır (parça için 'temp' dizisini kullanıyorum) Bu kayma nedeniyle düşüyor).
Diziyi değiştirmek zorunda mısın? Dizi kaydırılmış gibi davranan bir sarıcı yapamaz mısın? – svick
Güvenli olmayan kodlara ihtiyacınız yok. – SLaks
Eşyaları hiç hareket ettirmemek muhtemelen daha verimli olmaz mıydı - sadece bir endeksi takip edin ve öğeleri herhangi bir yere kopyalamadan dairesel olarak erişin. – aardvarkk