در این مقاله در مورد عملکرد کلکسیونهای مختلف مربوط به API Collection جاوا صحبت میکنیم. زمانی که از کلکسیونها سخن میگوییم، معمولاً یاد ساختمانهای داده List ،Map و Set و پیادهسازیهای رایج آنها میافتیم. قبل از هر چیز، به مفهوم پیچیدگی O بزرگ برای عملیات رایج میپردازیم و سپس برخی اعداد واقعی از عملیات کلکسیون در زمان اجرا ارائه خواهیم کرد. بنابراین با ما همراه باشید تا پیچیدگی زمانی عملیات جاوا روی انواع ساختمان داده را به زبان ساده توضیح دهیم.
به طور معمول زمانی که از پیچیدگی صحبت میکنیم منظورمان نمادگذاری O بزرگ است. به بیان ساده این نمادگذاری میزان رشد مدت زمان مورد نیاز برای اجرای الگوریتم را در صورت افزایش اندازه ورودی مشخص میسازد. برای یادگیری موارد بیشتر در مورد نمادگذاری O بزرگ پیشنهاد میکنیم از مطلب زیر بازدید نمایید:
کار خود را با لیست ساده آغاز میکنیم که یک کلکسیون مرتب است. در ابن بخش به بررسی عملکرد پیادهسازیهای ArrayList, LinkedList و CopyOnWriteArrayList میپردازیم.
ArrayList در جاوا توسط یک آرایه پشتیبانی میشود. بدین ترتیب میتوانیم منطق درونی پیادهسازی آن را درک کنیم. بدین ترتیب ابتدا روی پیچیدگی زمانی عملیات رایج در سطح بالا متمرکز میشویم:
این پیادهسازی از اینترفیس List زمانی که مشغول کار با اپلیکیشنهای چند نخی هستیم بسیار مفید است، چون دارای ویژگی «ایمنی نخ» ((thread-safe است.
در ادامه عملکرد O بزرگ را برای CopyOnWriteArrayList میبینید:
چنان که میبینید استفاده از کلکسیون به دلیل مشخصههای عملکردی متد add() بسیار پرهزینه است.
«لیست پیوندی» (LinkedList) یک ساختمان داده خطی است که شامل گرههایی برای نگهداری فیلدهای داده و ارجاعی به گرههای دیگر است. برای کسب اطلاعات بیشتر در مورد لیستهای پیوندی به لینک زیر مراجعه کنید:
در ادامه زمان تخمینی میانگین مورد نیاز برای اجرای برخی از عملیات ابتدایی را مشاهده میکنید:
اینک برای اثبات تئوری، کمی با دادههای واقعی کار میکنیم. به عبارت دقیقتر نتایج تست JMH یعنی Java Microbenchmark Harness را برای اغلب عملیات رایج کلکسیون ارائه میکنیم.
ابتدا پارامترهای اصلی تستهای بنچمارک را ارائه میکنیم:
سپس تعداد تکرارهای گرم کردن را روی 10 تعیین میکنیم. ضمناً میخواهیم زمان اجرای میانگین نتایج نمایش یافته را بر حسب میکروثانیه ببینیم.
اینک زمان آن رسیده است که تستهای بنچمارک را اجرا کنیم. ابتدا با ArrayList آغاز میکنیم:
درون ArrayListBenchmark کلاس State را برای نگهداری از دادههای اولیه اضافه میکنیم.
در این بخش یک ArrayList از اشیای Employee میسازیم. پس از اقدام به مقداردهی آن با 100،000 آیتم درون متد ()setUp میکنیم. State@ نشان میدهد که تستهای Benchmark@ دسترسی کاملی به متغیرهای اعلانشده در همان نخ دارند.
در نهایت نوبت آن میرسد که تستهای بنچمارک را برای متدهای ()add() ،contains() ،indexOf() ،remove و ()get اضافه کنیم:
همه نتایج بر حسب میکروثانیه ارائه شدهاند:
از روی نتایج فوق میفهمیم که متدهای ()testContains و ()testIndexOf تقریباً زمان اجرای یکسانی دارند. همچنین به وضوح میبینیم که تفاوت عظیمی بین نمرات متد ()testAdd و ()testGet از بقیه نتایج وجود دارد. افزودن یک عنصر باعث میشود که 2.296 میکروثانیه طول بکشد و دریافت آن نیز در طی زمان 0.007 میکروثانیه صورت میگیرد.
با این که زمان جستجو یا حذف یک عنصر تقریباً 700 میکروثانیه است، این اعداد اثباتی بر بخش نظری قبلی هستند که فهمیدیم پیچیدگی زمانی ()add و ()get به مقدار (O(1 و برای عملیات دیگر به مقدار (O(n است که در این مثال از n=10000 استفاده شده است.
به طور مشابه، میتوانیم همین تستها را برای کلکسیون CopyOnWriteArrayList بنویسیم. تنها چیزی که نیاز داریم جایگزینی ArrayList در employeeList با وهله CopyOnWriteArrayList است.
در ادامه نتایج بنچمارک را میبینید:
در این مورد نیز یک بار دیگر نتایج، تئوری را اثبات میکنند. چنان که میبینیم ()testGet به صورت میانگین در مدت زمان 0.006 میکروثانیه اجرا میشود و میتوانیم آن را O(1) تصور کنیم. در مقایسه با ArrayList نیز متوجه تفاوت زیادی بین نتایج متد ()testAdd میشویم. از آنجا که در اینجا پیچیدگی O(n) را برای متد ()add در برابر مقدار (O(1 برای ArrayList داریم.
به روشنی شاهد یک رشد خطی زمان هستیم، چون عملکرد عدد 878.166 را در مقایسه با 0.051 نمایش میدهد.
اینک نوبت به LinkedList میرسد:
از روی نمرات میتوان فهمید که افزودن و حذف عناصر در لیست پیوندی کاملاً سریع است. به علاوه یک شکاف عملکردی مهم بین عملیات add/remove و get/contains وجود دارد.
در جدیدترین نسخههای JDK شاهد بهبود عملکرد قابل توجهی برای پیادهسازیهای Map هستیم که شامل جایگزینی با ساختمان گره درخت متعادل متوازن در پیادهسازیهای درونی HashMap و LinkedHashMap میشود. این کار موجب کاهش زمان بدترین سناریوهای گشتن به دنبال عنصر از (O(n به O(log(n)) در زمان تصادم HashMap شده است.
با این حال در صورت پیادهسازی مناسب احتمال تصادم ()equals و ()hashcode بسیار پایین است.
لازمه به ذکر است که زمان بازیابی و ذخیرهسازی عناصر در HashMap به صورت (O(1 است.
اینک به بررسی مثالهای واقعی میپردازیم. ابتدا HashMap را بررسی میکنیم:
چنان که میبینیم اعداد ثابت میکنند که زمان ثابت O(1) برای اجرای متدهای فوق وجود دارد. اینک نمرات تست HashMap را با نمرات وهله دیگری از Map مقایسه میکنیم.
در مورد همه متدهای لیست شده برای HashMap ،LinkedHashMap ،IdentityHashMap ،WeakHashMap ،EnumMap و ConcurrentHashMap با زمان ثابت O(1) مواجه هستیم.
در ادامه نتایج نمرات باقیمانده تست را به شکل جدول مشاهده میکنید:
از روی اعداد خروجی میتوان تأیید کرد که ادعای پیچیدگی زمانی O(1) در این مورد صحیح است.
در مورد ساختمان درخت TreeMap و ConcurrentSkipListMap، عملیات ()put() ،get() ،remove و ()containsKey دارای پیچیدگی زمانی O(log(n)) است.
در این بخش میخواهیم مطمئن شویم که تستهای عملکردی ما تقریباً در زمان لگاریتمی اجرا میشوند. به همین جهت map-ها را به صورت پیوسته با n=1000, 10,000, 100,000, 1,000,000 آیتم مقداردهی میکنیم.
در این حالت به زمان کلی اجرا علاقهمند هستیم.
زمانی که n=1000 است، زمان کلی اجرا بر حسب میلیثانیه برابر با 00:03:17 است. در تعداد آیتم n=10,000 زمان تقریباً بدون تغییر و برابر با 00:03:18 میلیثانیه است. در تعداد n=100000، زمان اجرا به 00:03:30 افزایش مییابد. در نهایت زمانی که n = 1000000 میشود، زمان اجرا برابر با 00:05:27 میلیثانیه خواهد بود.
پس از مقایسه اعداد، زمان اجرای با تابع (log(n برای هر n، میتوان تأیید کرد که محاسبه هر دو تابع با هم مطابقت دارند.
به طور کلی Set یک کلکسیون با عناصر یکتا است. در این بخش قصد داریم پیادهسازی HashSet ،LinkedHashSet، EnumSet ،TreeSet ،CopyOnWriteArraySet و ConcurrentSkipListSet از اینترفیس Set را بررسی کنیم.
اینک مستقیماً به سراغ بررسی اعداد پیچیدگی زمانی میرویم. پیچیدگی زمانی برای عملیات ()add() ،remove و ()contains برای HashSet ،LinkedHashSet و EnumSet به صورت ثابت (O(1 است. این واقعیت به لطف پیادهسازی داخلی HashMap رخ داده است.
به طور مشابه پیچیدگی زمانی TreeSet برای عملیات لیست شده فوق به صورت ((O(log(n است. دلیل این امر به پیادهسازی TreeMap بازمیگردد. پیچیدگی زمانی برای ConcurrentSkipListSet نیز برابر با ((O(log(n است چون بر مبنای رد کردن ساختمان داده List طراحی شده است.
متدهای ()add() ،remove و ()contains برای CopyOnWriteArraySet دارای پیچیدگی زمانی میانگین (O(n است.
اینک به سراغ تستهای بنچمارک خود میرویم.
به علاوه پیکربندی بنچمارک را نیز همانند قبل و بدون تغییر بوده است.
در ادامه به مشاهده رفتار نمرات زمان اجرای HashSet و LinkedHashSet در هنگامی که n = 1000; 10,000; 100,000 آیتم است پرداختهایم.
در مورد HashSet نتایج به صورت زیر هستند:
به طور مشابه نتایج در مورد LinkedHashSet به صورت زیر هستند:
چنان که مشاهده میشود، نمرات برای همه عملیات تقریباً یکسان باقی مانده است. حتی هنگامی که آنها را با خروجیهای تست HashMap مقایسه میکنیم، همچنان یکسان به نظر میرسند.
در نتیجه تأیید میشود که همه متدهای تست شده در زمان ثابت (O(1 اجرا شدهاند.
در این مقاله پیچیدگی زمانی اغلب پیادهسازیهای ساختمانهای داده جاوا را مورد بررسی قرار دادیم. همچنین عملکرد زمان اجرای واقعی هر نوع از کلکسیون را از طریق تستهای بنچمارک JVM نشان دادیم. ضمناً عملکرد عملیات یکسان را در کلکسیونهای مختلف بررسی کردیم. در نتیجه اینک میتوانیم برای رفع نیازهای خود بهترین کلکسیون مناسب را انتخاب کنیم. همه کدهای مربوط به این مقاله را میتوانید در این ریپوی گیتهاب (+) ملاحظه ک
منبع: فرادرس
پایتون سبکهای کدنویسی مختلفی دارد و به نوعی میتوان گفت پذیرای همه سبکها است. هر کس میتواند با سابقه یادگیری هر نوع زبان برنامهنویسی دیگر از پایتون استفاده کند. اما باید توجه داشت که یادگیری یک زبان برنامهنویسی و آموختن آن به روش بهینه دو موضوع متفاوت هستند. در این مقاله با روشهای کاهش استفاده از حلقه for در پایتون آشنا میشویم.
بدین ترتیب در ادامه در مورد حلقههای for در پایتون و این که چطور میتوان از کاربرد غیرضروری آنها اجتناب کرد توضیح میدهیم. همه این موارد به وسیله یک مثال ساده ارائه میشوند. فرض کنید میخواهید مجموع مربعات را در یک لیست به دست آورید. این یک مسئله معتبر در حوزه یادگیری ماشین است که هر زمان که بخواهیم مسافت بین دو نقطه را در n بعد محاسبه کنیم از آن استفاده میکنیم. این کار با استفاده از حلقهها به سادگی قابل اجرا است.
در واقع سه روش برای انجام این کار وجود دارند که همه آنها را بررسی میکنیم و انتخاب هر کدام از آنها بر عهده شما است.
هر زمان که کد فوق را در یک کدبیس پایتون میبینید، بدانید که فردی با پیشزمینه C یا جاوا از پایتون استفاده کرده است. روش پایتونیتر برای نوشتن کد فوق به صورت زیر است:
این کد بهتر است چون لیست اندیسگذاری نمیشود و کد ما خوانایی بیشتری دارد. اما روش کاملاً پایتونی برای نوشتن کد فوق در یک خط به صورت زیر است:
این رویکرد به نام «خلاصهسازی لیست» (List Comprehension) نامیده میشود و شاید یکی از بهترین دلایل توجیه علاقه افراد به پایتون محسوب میشود. میتوان از if نیز در خلاصهسازی لیست استفاده کرد. فرض کنید میخواهیم فهرستی از اعداد مربع را صرفاً برای اعداد زوج محاسبه کنیم.
اینک اگر بخواهیم اعداد زوج مربع و اعداد فرد مکعب شوند چه کار باید بکنیم؟
می بینید که نوشتن کد به روش فوق چه قدر زیباتر و خلاصهتر است. هر زمان که خواستید یک گزاره for بنویسید، باید سؤالات زیر را از خود بپرسید:
برخی اوقات ما هم به اندیس در یک آرایه نیاز داریم و هم مقدار یک آرایه را میخواهیم. در چنین مواردی بهتر است به جای اندیس کردن لیست از enumerate استفاده کنیم.
قاعده کار چنین است:
آن را با یک مثال توضیح میدهیم. ما میخواهیم یک دیکشنری داشته باشیم که کلید آن برای هر مقدار x مربع آن مقدار است.
اگر بخواهیم یک دیکشنری صرفاً برای مقادیر زوج داشته باشیم چطور؟
اگر بخواهیم کلید ما برای مقادیر زوج، مربع آن مقدار و برای مقادیر فرد برابر با مکعب آن مقدار باشد چگونه باید عمل کنیم؟
در پایان باید گفت که گرچه به نظر میرسد انتقال دانش زبانهای برنامهنویسی دیگر به پایتون کار آسانی باشد اما در صورتی که این کار را انجام دهید، نمیتوانید زیبایی پایتون را درک کنید. پایتون زمانی که از روشهای اختصاصی آن استفاده کنید بسیار قدرتمندتر خواهد بود.
بنابراین در زمان نیاز به حلقه for باید از خلاصهسازی لیست و خلاصهسازی دیکشنری استفاده کنید. اگر به اندیسگذاری آرایه نیاز دارید از enumerate استفاده کنید. اما هر کاری میکنید همواره به خاطر داشته باشید که باید در حد امکان از حلقههای for احتراز کنید. بدین ترتیب کد شما خوانایی بیشتری خواهد داشت و قابلیت نگهداری آن نیز در بلندمدت افزایش مییابد.
منبع: فرادرس
سلام خدمت کاربران سایت میهن وردپرس ، در این پست مطلبی برای شما آماده کردیم که به نظر کم اهمیت هست ولی در واقع از اهمیت زیادی برخوردار است. اهمیت بروز رسانی سایت در بهبود سئو چقدر هست؟
آنچه در این مطلب میخوانید:
سئو مخفف کلمه Search Engine Optimization است. با استفاده از سئو میتوانید سایت خود را در ردیفهای بالای جستجوی کاربران قرار دهید درواقع هرچه رتبه شما در گوگل بالاتر باشد تعداد کاربرانی که از سایت شما بازدید میکنند بیشتر است که این نکته بسیار مهم میباشد و میتواند درفروش محصولات شما بسیار تأثیرگذار باشد. این کار کاملاً به عهده خودتان است و خودتان میتوانید تعیین کنید که رتبه بالاتری در گوگل داشته باشید. شما با انتشار مطالب و محتوای مفید در سایتتان میتوانید کاربرانتان را تشویق کنید که مطالب و لینک سایت شما را به اشتراک بگذارند. سئو چیست؟
این کار همچنین سبب میشود سایت شما ترافیک ورودی بیشتری داشته باشد. این خودتان هستید که تعیین میکنید روزی هزاران بازدیدکننده داشته باشید یا اینکه با اقدامی نابجا سایت خود را محدود کرده و درنهایت باعث دیده نشدن سایت خود شوید.
با پیشرفت فناوری سایتهای اینترنتی از اهمیت و جایگاه ویژهای برخوردار شدند. افراد بیشتر امور خود را از طریق اینترنت انجام میدهند و درواقع از اینترنت هم بهعنوان وسیلهای جهت خرید کالا و هم اطلاعرسانی استفاده میشود.
شما باید بتوانید با استفاده از محتوای جدید و بروزرسانی شده سایت خود را جز رتبههای بالا قرار داده و سئو سایت خود را بالا ببرید. همچنین این امر سبب میشود که عملکرد سایت شما بهبود پیدا کند. شما باید همواره از اطلاعات بروز آگاه باشید و آنها را طبق آخرین تغییرات خود در سایت خود قرار دهید. ساخت سایت بهتنهایی کافی نیست درواقع پشتیبانی از سایت از اهمیتی بسیار بالاتر از ساخت آن برخوردار است. سعی کنید همواره سایتی پویا داشته باشید و در آن از مطالب جذاب و مفید با توجه به نیاز روز جامعه استفاده کنید. در نظر داشته باشید که در بروزرسانی سایت خود به سبک موردپسند کاربر و سلیقه آن حتماً توجه کنید و آن را در درجه اول اهمیت قرار دهید. به طراحی و رنگها و تصاویر توجه ویژهای داشته باشید و آنها را یکنواخت به حال خود رها نکنید.
درواقع شما باید این را همیشه در نظر داشته باشید که همانطور که ساختن یک سایت مهم است نگهداری و حفظ سایت در درجه بالاتری از اهمیت قرار میگیرد چراکه اگر به سایت خود و بهروزرسانی آن اهمیت ندهید و محتوای باکیفیت در آن قرار ندهید ساخت آن بیفایده است.
اهمیت بروز رسانی سایت در سئو بسیار زیاد هست. وظیفه این بروز رسانی و بهبود عملکرد سایت و درنتیجه بالا بردن رتبه سایتتان در موتورهای جستجوگر بر عهده شما بهعنوان مدیر سایت است. همچنین اگر شما بتوانید در ساعت مشخصی سایت خود را بهروزرسانی کنید و محتوای مفید در سایت خود قرار دهید رتبه سایت خود را ارتقا میدهید. هرچقدر که محتوا غنیتر و باکیفیتتر باشد رتبه شما بالاتر میرود. همواره این را در نظر داشته باشید که کپی کردن از سایتهای دیگر رتبه شما را پایین میآورد.
شما میتوانید با استفاده از سیستمهای مدیریت محتوا سایت بسازید و بدون هیچ نگرانی آن را مدیریت و مرتباً بهروزرسانی کنید. این سیستمها کار شما را بسیار راحتتر کرده و دیگر نیازی به کدنویسی برای ایجاد سایت ندارید.
بروزرسانی نرمافزار سایت شما بهعنوان یکی از ستونهای مهم در سایت شما به شمار میرود. تمام محتوای تولیدشده توسط شما بهوسیله نرمافزار شما به کاربران ارائه میگردد. باید با در نظر گرفتن تمام جوانب سایت به برطرف کردن نواقص و ضعفهای آن پرداخته و محتوای موجود در سایت را بهبود دهید. این کار شما هیچوقت بهپایان نمیرسد شما باید همیشه و در همه حال سایت خود را دائما بروز رسانی کنید.
یکی دیگر از انواع بروزرسانی، بروزرسانی محتوا و مطالب سایت شما است. این محتوای سایت شما است که باعث جذب کاربران و افزایش بازید سایت شما میشود. پس محتوا در سایت از اهمیت ویژهای برخوردار است و باید به آن بسیار توجه شود، محتوای خوب باعث میشود شما بتوانید به تبلیغ بهتر محصولات خود نیز بپردازید و فروش خود را افزایش دهید.
شما باید بهعنوان مدیر سایت به بررسی سایت پرداخته و از اهمیت کلمات کلیدی غافل نشوید چون موتورهای جستجو بهطور خودکار کلمات کلیدی کاربران را جسنجو میکنند. پس سعی کنید این کلمات را شناخته و از آنها در محتوای خود بهکار بگیرید.
در نظر داشته باشید که تنها بهروزرسانی متن کافی نیست و باید عکسها، ویدئوها و… را نیز بهروزرسانی کنید و از عکس و ویدئوهای جدید استفاده کنید توجه داشته باشید که تصاویر و ویدئوها کاملاً مناسب و مطابق سایت و محتوای آن باشند بهطوریکه بازدیدکنندگان را مجذوب خود کنند، همچنین محتوا کاملاً واضح و روشن باشد و از هرگونه ابهام جلوگیری کنید. نیاز کاربران سایت بسیار مهم است و باید توجه ویژهای به آن شود، در نظر بگیرید که با توجه به درخواست کاربران مطالب جدید و بروز در اختیارشان قرار دهید. بنابراین شما باید با تحقیق اطلاعات کافی در این زمینه داشته باشید.
محتوای جدید و بروزرسانی شده به شما کمک میکند که کاربران بیشتری را به خود جذب کنید و اگر شما مطالب جدید را مرتب در سایت خود قرار ندهید کاربران خود را از دست میدهید و ترافیک داده شما کم میشود درواقع وقتی شما دائما مطالب مفید در سایت قرار دهید به کاربران خود این حس را القا میکنید که توجه ویژهای به آنها و نیازشان دارید.
در دنیای اینترنت هرروز خبری تازه و مطلبی تازه ساخته میشود وبسایتی موفق است که بتواند اولین نفری باشد که این مطلب را در سایت خود قرار دهد. مدیران وبسایتها نظم خاصی در بروز کردن سایتشان ندارند و هر وقت که دوست داشته باشند سایت خود را بروز میکنند. در مقابل بعضی از سایتها هستند که در یک روز ده تا دوازده مطلب در سایت خود قرار داده و تا یک ماه هیچ خبری از مطلب جدید در سایت آنها نیست.
امروزه دنیای رقابت است و در حال حاضر با رواج کسبوکار اینترنتی وبسایتها در حال رقابت باهم هستند، هرچه سایتی بروزتر و مطالب جدیدتر داشته باشد و به کاربران خود انتشار دهد از دیگر وبسایتها سبقتگرفته و موفقتر است. همچنین اگر سایت خود را بهصورت منظم بین یک بازه زمانی خاصی بروز کنید روباتهای گوگل میفهمند که مطالب سایت شما را بین این بازهی زمانی خاص ثبت کنند و بالعکس اگر شما سایت خود را هر وقت که دوست داشتید آپدیت کنید رباتهای گوگل بهصورت هفتگی مطالب سایت شما را ثبت میکنند و از دیگر رقبای خود عقب میافتید. به خاطر داشته باشید که منظم بودن در بروز رسانی سایت باعث میشود که گوگل مطالب شما را سریعتر ایندکس کند.
شما می توانید مابقی نکات سئو را در فیلم آموزش سئو وردپرس مشاهده بفرمایید.
امیدواریم این مقاله در زمینه درک اهمیت بروز رسانی سایت در سئو به شما کمک کرده باشد.
راستی! برای دریافت مطالب وردپرسی در کانال تلگرام میهن وردپرس عضو شوید.
منبع: میهن ورد پرس