ฉันมีความต้องการที่จะสร้างรายการชุดตัวเลข ตัวเลขที่มีขนาดเล็กมากเพื่อให้สามารถใช้มากกว่าbyte
int
อย่างไรก็ตามต้องใช้ลูปที่ซ้อนกันหลายอันเพื่อให้ได้ชุดค่าผสมที่เป็นไปได้ทั้งหมด ฉันสงสัยว่าจะมีวิธีที่มีประสิทธิภาพมากกว่านี้ในการทำสิ่งที่ฉันต้องการหรือไม่ รหัสจนถึงตอนนี้คือ:
var data = new List<byte[]>();
for (byte a = 0; a < 2; a++)
for (byte b = 0; b < 3; b++)
for (byte c = 0; c < 4; c++)
for (byte d = 0; d < 3; d++)
for (byte e = 0; e < 4; e++)
for (byte f = 0; f < 3; f++)
for (byte g = 0; g < 3; g++)
for (byte h = 0; h < 4; h++)
for (byte i = 0; i < 2; i++)
for (byte j = 0; j < 4; j++)
for (byte k = 0; k < 4; k++)
for (byte l = 0; l < 3; l++)
for (byte m = 0; m < 4; m++)
{
data.Add(new [] {a, b, c, d, e, f, g, h, i, j, k, l, m});
}
ฉันกำลังพิจารณาใช้บางอย่างเช่น a BitArray
แต่ฉันไม่แน่ใจว่าจะรวมเข้าด้วยกันได้อย่างไร
คำแนะนำใด ๆ จะได้รับการชื่นชมอย่างมาก หรือบางทีนี่อาจเป็นวิธีที่เร็วที่สุดในการทำสิ่งที่ฉันต้องการ?
แก้ไข ประเด็นด่วนสองสามข้อ (และขออภัยที่ฉันไม่ได้ใส่ไว้ในโพสต์ต้นฉบับ):
- ตัวเลขและลำดับ (2, 3, 4, 3, 4, 3, 3 ฯลฯ ) มีความสำคัญมากดังนั้นการใช้วิธีแก้ปัญหาเช่นการสร้างการเรียงสับเปลี่ยนโดยใช้ LINQจะไม่ช่วยได้เนื่องจากค่าสูงสุดในแต่ละคอลัมน์คือ แตกต่างกัน
- ฉันไม่ใช่นักคณิตศาสตร์ดังนั้นฉันต้องขออภัยหากฉันไม่ได้ใช้คำศัพท์ทางเทคนิคเช่น 'การเรียงสับเปลี่ยน' และ 'ชุดค่าผสม' อย่างถูกต้อง :)
- ผมไม่จำเป็นต้องเติมทั้งหมดของชุดเหล่านี้ในครั้งเดียว - ฉันไม่สามารถเพียงแค่คว้าหนึ่งหรืออีกขึ้นอยู่กับดัชนี
- ใช้
byte
เร็วกว่าใช้int
ผมรับประกันได้ นอกจากนี้ยังดีกว่ามากในการใช้หน่วยความจำที่มีอาร์เรย์ 67m + ของไบต์แทนที่จะเป็น ints - เป้าหมายสูงสุดของฉันคือการมองหาทางเลือกอื่นที่เร็วกว่าสำหรับการวนซ้ำแบบซ้อนกัน
- ฉันพิจารณาใช้การเขียนโปรแกรมแบบขนาน แต่เนื่องจากลักษณะการทำซ้ำของสิ่งที่ฉันพยายามจะบรรลุฉันจึงไม่พบวิธีที่จะทำให้สำเร็จได้ (แม้จะมี
ConcurrentBag
) - อย่างไรก็ตามฉันยินดีที่ได้รับการพิสูจน์ว่าผิด :)
บทสรุป
Caramiriel ได้จัดเตรียมการเพิ่มประสิทธิภาพไมโครที่ดีซึ่งช่วยลดเวลาในการวนซ้ำดังนั้นฉันจึงทำเครื่องหมายคำตอบนั้นว่าถูกต้อง Eric ยังกล่าวว่าการจัดสรรรายการล่วงหน้าเร็วกว่า แต่ในขั้นตอนนี้ดูเหมือนว่าลูปที่ซ้อนกันเป็นวิธีที่เร็วที่สุดในการทำสิ่งนี้ (น่าหดหู่ฉันรู้!)
หากคุณต้องการลองสิ่งที่ฉันพยายามเปรียบเทียบด้วยStopWatch
ให้ไปกับ 13 ลูปที่นับได้ถึง 4 ในแต่ละลูปซึ่งทำให้ประมาณ 67m + เส้นในรายการ ในเครื่องของฉัน (i5-3320M 2.6GHz) ใช้เวลาประมาณ 2.2 วินาทีในการทำเวอร์ชันที่ปรับให้เหมาะสม