مواردی در رابطه با ساختار آرایه ها که باید بدونید! 🦦
اول از همه باید بدونیم که دو نوع آرایه وجود داره، استاتیک و داینامیک.
1️⃣ آرایه های استاتیک مقادیر خودشون در استک ذخیره میکنن و اندازشون باید در زمان کامپایل مشخص باشه. این محدودیت به این معنی هست که اگه میخواید یک آرایه با اندازه ورودی کاربر باشه، نمیتونیم از آرایه استاتیک استفاده کنیم. از طرف دیگه آرایه های داینامیک به شما امکان میدن اندازه آرایه رو در زمان اجرا مشخص کنین.
2️⃣ آرایه ها میتونن هر تعداد ابعاد (1 بعدی، 2 بعدی، سه بعدی و غیره) داشته باشن و هر بعد میتونه هر اندازه ای داشته باشه که توسط حافظه کامپیوتر محدود میشه.
3️⃣ حلقه های For مناسب ترین ساختار برای تکرار روی یک آرایه هستن. همچنین همونطور که میدونید ایندکس های آرایه از 0 شروع میشن نه 1.
4️⃣ آرایه ها راهی برای ذخیره لیستی از آیتم ها در یک متغیر فراهم می کنن. قبلاً اگه نیاز به ذخیره چندین مقدار داشتید، برای هر کدوم متغیرهای جداگانه ای تنظیم کردید. با این حال، آرایه ها این کار رو با اجازه دادن به مقادیر متعدد برای ذخیره تحت یک نام متغیر ساده میکنن. به عنوان مثال، میتونیم یک آرایه برای ذخیره فهرستی از نامها (رشتهها)، سنها (اعداد صحیح)، اعداد اعشاری (floats)، یا حتی تایپ سفارشی ایجاد کنید. هر مقدار در یک آرایه در یک bucket جداگانه ذخیره میشن و میتونید بر اساس ایندکس اون در لیست به یک باکت خاص مراجعه کنین.
6️⃣ حافظه مصرف شده توسط یک آرایه استاتیک به دو عامل بستگی داره:
🔵 اندازه آرایه: این تعداد کل عناصر آرایه هست.
🔵 اندازه هر عنصر: این به نوع داده آرایه بستگی داره. به عنوان مثال، یک «int» معمولاً 4 بایت، یک «char» یک بایت و یک «float» معمولا 4 بایت و یک ««double»» معمولا 8 بایت داره.
7️⃣ کل حافظه مورد نیاز یک آرایه استاتیک رو میشه با استفاده از فرمول زیر محاسبه کرد:
- Memory Consumption (bytes) = Number of Elements * Size of Each Element (bytes)
به عنوان مثال:
در اینجا، «myArray» دارای 100 عنصر هست و هر «int» معمولاً 4 بایت هست که به صورت زیر محاسبه میشه:
این آرایه 400 بایت حافظه مصرف میکنه.
برای اطلاعات و مشاهده موارد بیشتر، پیشنهاد میکنم مقالات زیر رو بخونید.
- Article
- Article
- Article
#array
@CodeModule
اول از همه باید بدونیم که دو نوع آرایه وجود داره، استاتیک و داینامیک.
هر باکت با یک ایندکس عددی همراه هست که از 0 شروع میشه و برای هر باکت بعدی 1 افزایش پیدا میکنه. این شاخص برای اشاره به یک ایندکس خاص در آرایه استفاده میشه. برای مثال، در یک آرایه «ages» با عناصر «[66، 53، 39، 24]»، باکت اول (ایندکس 0) مقدار «66» رو نگه میداره، باکت دوم (ایندکس 1) دارای «53» هست، و به همین ترتیب تا انتها.
- Memory Consumption (bytes) = Number of Elements * Size of Each Element (bytes)
به عنوان مثال:
int myArray[100];
در اینجا، «myArray» دارای 100 عنصر هست و هر «int» معمولاً 4 بایت هست که به صورت زیر محاسبه میشه:
- Memory Consumption (bytes)= 100 * 4 = 400(bytes)
این آرایه 400 بایت حافظه مصرف میکنه.
برای اطلاعات و مشاهده موارد بیشتر، پیشنهاد میکنم مقالات زیر رو بخونید.
- Article
- Article
- Article
#array
@CodeModule
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡10🔥5❤🔥4👌1
Array indexing چیست؟🚀
Array indexing تکنیکیه که برای دسترسی به المنت ها در یک آرایه بر اساس موقعیت یا ایندکس اونها استفاده میشه. همونطور که میدونید هر المنت در یک آرایه با ایندکس خود مشخص میشه که نشون دهنده موقعیت اون نسبت به المنت اول هست. ایندکسینگ امکان دسترسی موثر و مستقیم به هر المنت در آرایه رو فراهم میکنه که برای کارهای محاسباتی مختلف ضروری هست. به عنوان مثال یک آرایه یک بعدی رو در نظر بگیرید:
در این آرایه 5 عنصر وجود داره که در مکان های حافظه به هم پیوسته ذخیره میشن. ایندکس المنت اول 0، المنت دوم 1 و... هست. و همونطور که میدونید برای دسترسی مثلا به المنت سوم آرایه باید اینکار رو انجام بدیم:
از اونجا که ایندکسینگ از صفر شروع میشه در واقع ایندکس دوم به المنت سوم اشاره داره. اما میدونستید میشه هر کدوم از این هارو محاسبه کرد؟
موقعیت هر المنت در یک آرایه یک بعدی رو میشه با استفاده از یک فرمول ساده محاسبه کرد. این فرمول آدرس پایه آرایه، ایندکس المنت و اندازه هر المنت در حافظه رو محاسبه میکنه( توجه داشته باشید فقط برای آرایه های یک بعدی جوابه)
به عنوان مثال، اگر آدرس پایه آرایهA هزار باشه و هر عدد صحیح 4 بایت حافظه اشغال کنه، آدرس المنت در ایندکس دوم میشه:
بنابراین، المنت در ایندکس 2 در حافظه به آدرس 1008 ذخیره میشه.
محاسبه آدرس المنت چند بعدی⬇️
اما این ها برای آرایه های یک بعدی بود و برای آرایه های چند بعدی مساعل پیچیده تر میشه، چون باید چندین ایندکس رو در نظر بگیرید. با این حال، فرآیند رو میشه به صورت انتراعی توضیح داد. به عنوان مثال فرمول کلی ما در آرایه های یک بعدی اینه: ( فرمول بالایی هم هست اما این جامع تره)
به صورت خلاصه معنی این فرمول یعنی این:
- B: آدرس پایه آرایه است.
- W: اندازه هر المنت در بایت.
- i: ایندکس المنت.
- L_B(lower bound): به کوچکترین یا مقدار ایندکس اولیه ای که المنت آرایه از اون ایندکس شروع میشه اشاره داره. ( به صورت دیفالت 0 هست که در نظر گرفته نمیشه)
#array
@CodeModule
Array indexing تکنیکیه که برای دسترسی به المنت ها در یک آرایه بر اساس موقعیت یا ایندکس اونها استفاده میشه. همونطور که میدونید هر المنت در یک آرایه با ایندکس خود مشخص میشه که نشون دهنده موقعیت اون نسبت به المنت اول هست. ایندکسینگ امکان دسترسی موثر و مستقیم به هر المنت در آرایه رو فراهم میکنه که برای کارهای محاسباتی مختلف ضروری هست. به عنوان مثال یک آرایه یک بعدی رو در نظر بگیرید:
int A[5] ={10, 20, 30, 40, 50}
در این آرایه 5 عنصر وجود داره که در مکان های حافظه به هم پیوسته ذخیره میشن. ایندکس المنت اول 0، المنت دوم 1 و... هست. و همونطور که میدونید برای دسترسی مثلا به المنت سوم آرایه باید اینکار رو انجام بدیم:
A[2] = 30;
از اونجا که ایندکسینگ از صفر شروع میشه در واقع ایندکس دوم به المنت سوم اشاره داره. اما میدونستید میشه هر کدوم از این هارو محاسبه کرد؟
موقعیت هر المنت در یک آرایه یک بعدی رو میشه با استفاده از یک فرمول ساده محاسبه کرد. این فرمول آدرس پایه آرایه، ایندکس المنت و اندازه هر المنت در حافظه رو محاسبه میکنه( توجه داشته باشید فقط برای آرایه های یک بعدی جوابه)
Address of A[i] = Base Address + (i * Size of each element)
به عنوان مثال، اگر آدرس پایه آرایهA هزار باشه و هر عدد صحیح 4 بایت حافظه اشغال کنه، آدرس المنت در ایندکس دوم میشه:
Address of A[2] = 1000 + (2 * 4) = 1008
بنابراین، المنت در ایندکس 2 در حافظه به آدرس 1008 ذخیره میشه.
محاسبه آدرس المنت چند بعدی
اما این ها برای آرایه های یک بعدی بود و برای آرایه های چند بعدی مساعل پیچیده تر میشه، چون باید چندین ایندکس رو در نظر بگیرید. با این حال، فرآیند رو میشه به صورت انتراعی توضیح داد. به عنوان مثال فرمول کلی ما در آرایه های یک بعدی اینه: ( فرمول بالایی هم هست اما این جامع تره)
Address of A[i] = B + W * (i - L_B)
به صورت خلاصه معنی این فرمول یعنی این:
- B: آدرس پایه آرایه است.
- W: اندازه هر المنت در بایت.
- i: ایندکس المنت.
- L_B(lower bound): به کوچکترین یا مقدار ایندکس اولیه ای که المنت آرایه از اون ایندکس شروع میشه اشاره داره. ( به صورت دیفالت 0 هست که در نظر گرفته نمیشه)
برای اینکه پست زیادی طولانی نشه، ادامه مطالب رو در تلگراف برای شما عزیزان آماده کردیم🙂
#array
@CodeModule
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14⚡4
علتش چیه؟ 😠
چند وقت پیش داشتم الگوریتم مرتب سازی insertion رو پیاده سازی میکردم و برام سوال شد، چجوری میتونم سرعت مرتب سازی رو بیشتر کنم (در حد کنجکاوی). در هنگام پیادهسازی الگوریتم مرتبسازی Insertion Sort در جاوااسکریپت، معمولاً این الگوریتم به صورت زیر نوشته میشه:
در اینجا، زمان اجرای الگوریتم با استفاده از console.time() و console.timeEnd() اندازهگیری میشه. معمولاً زمان اجرای این کد بین ۱۰ تا ۱۵ میلیثانیه متغیر هست. به این صورت:
حالا اگر خروجی آرایه رو به یک رشته تبدیل کنیم و سپس اون رو برگردونیم:
خروجی:
با انجام این تغییر، زمان اجرای الگوریتم به صورت چشمگیری کاهش پیدا میکنه و بین ۸ تا ۱۰ میلیثانیه متغیر میشه.
سوال اصلی اما اینجاست:
چرا تبدیل آرایه به رشته باعث کاهش زمان اجرای الگوریتم مرتبسازی Insertion میشه؟ آیا این تغییرات قابل توجه هستن و باید در برنامه هایی که میسازیم نگران چنین تفاوتهای جزئی ای باشیم؟
#nodejs #array
@CodeModule
چند وقت پیش داشتم الگوریتم مرتب سازی insertion رو پیاده سازی میکردم و برام سوال شد، چجوری میتونم سرعت مرتب سازی رو بیشتر کنم (در حد کنجکاوی). در هنگام پیادهسازی الگوریتم مرتبسازی Insertion Sort در جاوااسکریپت، معمولاً این الگوریتم به صورت زیر نوشته میشه:
function insertionSort(arr) {
for (let i = 1; i < arr.length; i = i + 1) {
let cE = arr[i];
let j = i;
while (j > 0 && arr[j - 1] > cE) {
arr[j] = arr[j - 1];
j = j - 1;
}
arr[j] = cE;
}
return arr;
}
console.time();
const uArray = [20, 10, 4, 51, 0, 0xd3, 0x42, 0.4, 0.00002, 0x2];
const sArray = insertionSort(uArray);
console.log("Sorted array:", sArray);
console.timeEnd();
در اینجا، زمان اجرای الگوریتم با استفاده از console.time() و console.timeEnd() اندازهگیری میشه. معمولاً زمان اجرای این کد بین ۱۰ تا ۱۵ میلیثانیه متغیر هست. به این صورت:
Sorted array: [ 0, 0.00002, 0.4, 2, 4, 10, 20, 51, 66, 211 ]
default: 10.793ms
حالا اگر خروجی آرایه رو به یک رشته تبدیل کنیم و سپس اون رو برگردونیم:
return String(arr);
خروجی:
Sorted array: 0,0.00002,0.4,2,4,10,20,51,66,211
default: 8.899ms
با انجام این تغییر، زمان اجرای الگوریتم به صورت چشمگیری کاهش پیدا میکنه و بین ۸ تا ۱۰ میلیثانیه متغیر میشه.
سوال اصلی اما اینجاست:
چرا تبدیل آرایه به رشته باعث کاهش زمان اجرای الگوریتم مرتبسازی Insertion میشه؟ آیا این تغییرات قابل توجه هستن و باید در برنامه هایی که میسازیم نگران چنین تفاوتهای جزئی ای باشیم؟
#nodejs #array
@CodeModule
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤🔥2