PDA

View Full Version : استفاده از آرایه دندانه ای



reza331
شنبه 23 دی 1391, 15:26 عصر
میخوایم یه دونه ارایه دندانه ای از نوع string داشته باشم برای تعریف ایرادی نمیگیره
اما برای تعریف دندانه ها و مقدار دهیشون ایراد میگیره کسی میتونه کمک کنه؟

ordebehesht
شنبه 23 دی 1391, 15:53 عصر
آرایه دندانه ای دیگه چیه؟؟؟؟؟؟؟؟؟

مهرداد صفا
شنبه 23 دی 1391, 19:59 عصر
سلام
میتوانید به روش زیر عمل کنید:

string[][] strings = new string[5][]{
new string[5],new string[5],new string[5],new string[5],new string[3]};

group45
شنبه 23 دی 1391, 23:15 عصر
سلام
میتوانید به روش زیر عمل کنید:

string[][] strings = new string[5][]{
new string[5],new string[5],new string[5],new string[5],new string[3]};

با سلام
این آرایه به چه کاری میاد؟
مدیریتش تو رم چطوریه؟
حافظه زیادی میخواد؟

مهرداد صفا
یک شنبه 24 دی 1391, 01:21 صبح
با سلام
این آرایه به چه کاری میاد؟
مدیریتش تو رم چطوریه؟
حافظه زیادی میخواد؟


مجددا سلام

این آرایه (در حالت دو بعدی) در واقع آرایه ایست از آرایه ها که هر یک از آرایه های عضو میتوانند طول مختص به خود را داشته باشند. این موضوع میتواند در مدیریت بهتر داده ها مفید باشد. مثلا ارایه ای می خواهیم از کلاسهای یک مدرسه که کلاسها هم ممکن است تعداد متفاوتی دانش آموز داشته باشند، با استفاده از jagged array میتوانیم به صورت زیر تعریف کنیم:

string[][] classes = new string[2][]{
new string[ClassRoom1.Length],new string [ClassRoom2.Length]};


یا فرض کنید میخواهیم تعدادی فایل را با طول متفاوت در حافظه بخوانیم. اگر تعداد فایلها زیاد باشد کنترل تعداد زیادی آرایه میتواند کنترل کدهای برنامه را مشکلتر کند در حالی که میتوانیم همه این آرایه ها را در یک آرایه دیگر قرار دهیم:

string[] files=Directory.GetFiles(@"e:\temp\","*");
byte[][] buffers = new byte[files.Length][];
for (int i=0;i< buffers.Length;i++)
{
buffers[i]=File.ReadAllBytes(files[i]);
}

jagged array ساختار متفاوتی نسبت به آرایه دو بعدی دارد. مثلا در یک آرایه هزار در هزار در مورد jagged array یک آرایه کلی و هزار آرایه عضو (در مجموع 1001) شی در manage heap ساخته میشود که گذشته از فضای 1000000 خانه ای آرایه، 1001 شی خود فضایی را اشغال میکند در حالی که یک آرایه دو بعدی با همین طول در واقع یک شی با طول 1000000 خانه به وجود می آورد.
در یک مثال به بررسی فضای اشغالی هر مورد می پردازیم.
یک آرایه دندانه ای 1000X1000:

long BeforeAllocate=GC.GetTotalMemory(true);
byte[][] JaggedArray = new byte[1000][];
for (int j = 0; j < 1000; j++)
{
JaggedArray[j]=new byte[1000];
}

Console.WriteLine("memory used for 1000*1000 jagged array: " + (GC.GetTotalMemory(true)-BeforeAllocate).ToString());

نتیجه:
memory used for 1000*1000 jagged array: 1016016


یک آرایه دو بعدی 1000X1000:

BeforeAllocate = GC.GetTotalMemory(true);
byte[,] Array2D = new byte[1000, 1000];
Console.WriteLine("memory used for 1000*1000 Array2D: "+ (GC.GetTotalMemory(true) - BeforeAllocate).ToString());

نتیجه:
memory used for 1000*1000 Array2D: 1000032

توضیح:
ابتدا فضای کلی مورد استفاده برنامه را در یک متغیر (BeforeAllocate) ریختیم و آرایه را ساخته فضای قبلی را از فضای فعلی کم کردیم و نتیجه را که فضای مصرفی آرایه است، نمایش دادیم. این فضا در مورد آرایه دندانه ای گذشته از 1000000 بایتی که فضای داده های آرایه است، برابر با 1616=1001*16 بود. و در مورد آرایه دو بعدی 32 بایت. البته این اختلاف در مورد آرایه های سه بعدی یا بیشتر، بسیار بیشتر از این میشود.

برای درک بهتر تفاوت عملکرد هر یک از این دو نوع آرایه، یک کتاب دو هزار صفحه ای را در نظر بگیرید. اگر این کتاب در ده جلد 200 صفحه ای و در یک قفسه نگهداری شود:
1- ساخت و چیدن کتابها در قفسه زمانبر تر است.
2- کتابها و مطالب آنها منظمترند و دسترسی به مطلب مورد نظر بسیار سریعتر صورت میگیرد.
3- جابه جایی و بیرون بردن کتابها و قفسه نیاز به زمان بیشتری دارد.
ولی اگر یک کتاب دو هزار صفحه ای داشته باشیم جابه جایی آن راحتتر است ولی پیدا کردن یک مطلب مشخص در میان دو هزار صفحه زمان بیشتری نیاز دارد.
نتیجه گیری اخلاقی:
1- آرایه های دندانه ای زمان بیشتری برای ساخت و memory allocation نیاز دارند.
2- آرایه های دندانه ای انعطاف پذیر ترند.
3- دسترسی مستقیم به اعضای آرایه های دندانه ای با سرعت بیشتری انجام میشود.
4- آرایه های دندانه ای فضای بیشتری را در حافظه اشغال میکنند.
5- آرایه های دندانه ای زمان بیشتری برای تخریب (آزاد سازی منابع) نیاز دارند.

موفق باشید!