Basit veri türlerini bilinen boyuttaki dizide belirli konumlara taşımanın en hızlı yolu nedir?Dizideki basit veri türlerini belirli konumlara taşımak için en hızlı yol
bir int olarak depolanan bir oyun tahtası döner vardı özel durum [9]
[0,1,2,3,4,5,6,7,8]
Her döner gereken bu dizilerin bir vektör, vardı kullanımım durumda [6,3,0,7,4,1,8,5,2]
olur.
Kurulu Düzen:
board1|corners|centers
0 1 2 | 0 2 | 1
3 4 5 | | 3 5
6 7 8 | 6 8 | 7
board2|corners|centers
6 3 0 | 6 0 | 3
7 4 1 | | 7 1
8 5 2 | 8 2 | 5
Ben ile geldi en hızlı yöntemi dizi girdileri atamak ve sonra geri belleği kopyalamak için bir ortak değişken yaratmaktı. o
Hem nispeten olan (tek iş parçacığı üzerinde yarısından daha az hız) çok daha yavaş saatler ..though
int layout[9];
int pub_layout[9];
#include <cstring> // for std::memcpy
void rotate(int layout[])
{
pub_layout[4] = layout[4]; // center
pub_layout[0] = layout[6]; // corner four
pub_layout[6] = layout[8];
pub_layout[8] = layout[2];
pub_layout[2] = layout[0];
pub_layout[1] = layout[3]; // center four
pub_layout[3] = layout[7];
pub_layout[7] = layout[5];
pub_layout[5] = layout[1];
std::memcpy(layout,pub_layout,sizeof(pub_layout));
}
Ben
int[] b = new int[] {b[6], b[3], b[0], b[7], b[4], b[1], b[8], b[5], b[2]};
önerir benzer bir soru here gördük Bu hızlı yöntem değilse hızlı (see a test here)
, nedir?
Algoritmanın hem C hem de C++ 'da aynı olacağından şüpheleniyorum. Eğer memcpy çağrıyı ve [4] [4] atama kazanç bu biriyle
Gönderdiğiniz test koduyla ilgili birkaç sorun. 'Rotate2()' işlevi, döndürme() 'değilken dinamik bellek ayırmalarını (bu örnek koddaki tüm sızıntı, btw) içerir. Yani, rotate2() 'nin daha yavaş olması şaşırtıcı değildir. [Burada] (http://coliru.stacked-crooked.com/a/bc6b9bc5ecfd42ce) C++ 11 kapsayıcılar ve algoritmalar kullanan biraz değiştirilmiş bir koddur. Bu durumda, rotate() ve rotate2(), benzerdir ve herhangi bir dinamik bellek ayırımı içermez. – crayzeewulf
, _not_ satır sırasına kaydetmeyi düşündünüz mü? Eğer onları 0, 1, 2, 5, 8, 7, 6, 3, 4 'sıralarında sakladıysanız ve' int 'yerine 'char' kullandıysanız, kartın döndürülmesi sadece ilk 8 elemanın 3 element kayması gerektirir. son elemanı (konum 4) değişmez bırakarak. – Alnitak
daha da fazlası, tek bir 'long'da saklanan 8 eleman ile rotasyon iki 24-bit vardiya işlemi ve biraz bit maskeleme ile elde edilebilir. – Alnitak