مشاهده نسخه کامل
: حذف عناصر تکراری از یک ارایه؟
kiuhnmgtrdcv
21-10-2008, 16:28
سلام دوستان من یک ارایه 100000 عنصری دارم که 100000 تا عدد تصادفی توی این ارایه ریختم مثلا اعداد تو بازه 001000 تا 999999
میخوام ببینم چطور میتونم عناصر تکراری رو از این ارایه پاک کنم؟ من اگر بیام یه ارایه دیگه درست کنم بعد بیام عناصر ارایه اولی را تو بریزم بعد ارایه دومی رو با اولی مقایسه کنم این کار عاقلانه ای هست؟ چون تعداد اعداد زیاده اگر بخوام اینطوری مقایسه کنم که اول اعداد درون ارایه رو مرتب کنم در اینصورت ترتیب اعداد تصادفی بهم میریزه ؟
hamidreza_buddy
22-10-2008, 01:37
اگه عناصرت توی بازه خاصی باشه می تونی یه آرایه با اون بازه درست کنی (با مقدار اولیه صفر) بعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی.
در آخر هم چک کنی هر کدوم از عناصر آرایه دوم «یک» شده بودند اون عنصر تو آرایه یک یا بیشتر تکرار شده و می تونی توی آرایه نتیجه اون رو بریزی.
مثلاً توی مسئله شما، یه آرایه به اندازه 999999 درست کن به نام mark. بعد مقدار یه عنصر از آرایه اول رو بخون و با اندایس تو آرایه mark رو یک کن.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در آخر هم توی یه حلقه توی mark بگرد و اونایی رو که «یک» هستند رو توی آرایه result بریز.
kiuhnmgtrdcv
22-10-2008, 09:56
بعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی.
ببخشید من منظور شما رو از این جمله نفهمیدم یک کردن یعنی چی؟ چطوری؟
hamidreza_buddy
22-10-2008, 22:29
همون کدی که تو پست قبل گذاشتم رو نیگا بنداز.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
در اینجا آرایه وسطی mark هست که به ازای هر عدد یه عنصر داره و اگه یک یا بیشتر از اون عدد تو آرایه array موجود باشه یک می شه و اگه موجود نباشه همون صفر باقی می مونه.
پس در آخر می تونیم عناصری از آرایه mark رو که یک هستند رو انتخاب کنیم. مثلاً در شکل بالا 1 و 3 و 4 یک هستند. در نتیجه اون ها رو توی آرایه نتیجه قرار می دهیم (چون برای ما تعداد تکرار های یک عدد مهم نیست و فقط مهم اینه که آیا یک عدد موجود بوده یا نه)
kiuhnmgtrdcv
23-10-2008, 11:05
سلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد:31:
سلام
با اجازه دوستم عزیزم جناب hamidreza_buddy
اگر آرایه های مرتب شده باشند یا مرتب بشوند کار خیلی ساده تر است وگرنه باید به ازای هر آیتم اعضای تا آن نقطهرا اسکن کنید.
ولی در اصل چیز دیگری را میخواستم بگویم این نبود!...
اگر هدفتان الگوریتم نویسی و آزمایشی و... نیست با امکانات فوق العاده قدرتمند LINQ شما قاد خواهید این اعمال به سادگی و بدون نگرانی از الگوریتم و... بنویسید و قوای فکری خود را روی مسائل مهم تر متمرکز کنید.
مثلاً ارایه زیر را داریم...
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(جالب این است که میتواند اصلاً آرایه نباشد، و هر لیست قابل شمارشی مجاز است و حتی این لیست شمارشی میتواند یک ساختار structure یا class باشد)
دستورات LINQ رای دیتای فوق:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این دستورات فوق العاده ساده و بچه گانه linq هستند و group و join و Where و... میتوان روی ساختارهای تو در توی شمارشی اعمال کرد و خروجی شمارشی یک بلوک linq را خوراک ورودی یک دستور دیگرش کرد....
همانطور که مشاهده کردید حذف آیتم های تکراری فقط یک خط کد میشود!
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
=====
این روش صنعتی است که مایکروسافت در دات پیشنهاد داده و تا حالا در هیچ زبان برنامه نویسی واقعی سابقه نداشته و در انحصار زبان دیتابیسی sql بوده.
همانطور که دیگر برنامه نویسان به نوشتن رکوردی فایل ها و ذخیره و بازیابی اطلاعات در فایل توجه زیادی نمیکنند و آن را به موتورهای بانک های رابطه ای میسپارند، همین وضع در بخش های دیگر هم وجود دارد تا فکر برنامه نویس را از جزئیات و +1 و -1 آزاد کند.
=====
البته حالا که تایپ مطالب تمام کردم، دلم نیامد یاد ایام جوانی و ++C را نکنم!
در نتیجه بدون LINQ (و بیشتر برای علاقه خودم) کد زیر را برای حذف عناصر تکراری نوشتم.
(
طبیعتاً اگر سعی کنید خودتان کدنویسی کنید و متوجه هم شوید خیلی بهتر و بنیادین تر است، میتوانید روی پیاده سازی الگوریتم جناب hamidreza_buddy فکر کنید، چیزی که خودتان با صرف روزها کار به آن برسد به نظر من بسیار ارزشمند تر از کپی برداری است.
)
نتیجه آرایه ای جدید است که تعداد اعضای اصلی آن iCount خواهد بود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(کد اول VB.Net بود و دومی C#.Net ، به این میگن انصاف در کدنویسی!!!! :31:)
hamidreza_buddy
23-10-2008, 15:07
سلام جناب H2. خوب هستین شما؟!
این LINQ که گفتین فقط تو vb.net موجوده؟
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(کد اول VB.Net بود و دومی C#.Net ، به این میگن انصاف در کدنویسی!!!! :31:)
این کدی که گذاشتین از مرتبه o(n^2) و با توجه به اندازه بزرگ آرایه در مسئله دوست ما فکر کنم عملی نباشه!
البته تو دات نت گرفتن یه آرایه 1 میلیون عنصری ممکنه؟
hamidreza_buddy
23-10-2008, 15:14
سلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد:31:
توی تگ کد کپی کنید کدتون رو:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
code* ها رو بدون ستاره بنویس.
کدتون این بود:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آره. ولی اگه به جای جمع با یک فقط اون رو مساوی یک هم قرار بدی فرقی نمی کنه.
آخرش هم این کد رو می گذارید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
kiuhnmgtrdcv
23-10-2008, 19:08
h2 جان من این کدو نوشتم مرسی از راهنمایی همچینن hamidreza_buddy
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
[RIGHT]hamidreza_buddy ببین یاد گرفتم کد بزارم :31:
سلام
این LINQ که گفتین فقط تو vb.net موجوده؟
همانطور که میدانید امکانات دات نت در انحصار زبان خاصی نیست ولی در انحصار دات نت است!!!!!
معمولاً تمام دستورات VB.Net و C#.Net به راحتی قابل تبدیل به هم هستند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این کدی که گذاشتین از مرتبه o(n^2) و با توجه به اندازه بزرگ آرایه در مسئله دوست ما فکر کنم عملی نباشه!
البته تو دات نت گرفتن یه آرایه 1 میلیون عنصری ممکنه؟
در واقع اون کد را بیشتر برای خودم نوشتم!
اون کد به تخصیص آرایه ای برابر با آرایه اولیه نیاز دارد و دو حلقه تودر توی آن در بدترین شرایط به اندازه یک حلقه واحد n(n-1)/2 شمارشی خواهد بود.
مثلاً برای آرایه ای 10 هزار عضوی نیاز به یک آرایه دیگر 10 هزار عضوی دارد و در بدترین شرایط حلقه 50 میلیون بار اجرا میشود !!!
برای یک میلیون عضو، تخصیص آرایه 1 میلیون عضوی مشکلی شاید نداشته باشد ولی حلقه 500 میلیاردی (در بدترین شرایط) من بدون شک یک کم برنامه را کند میکند!!! :31:(البته linq هم نمیتواند روی آرایه یک میلون عنصری سرعت بالایی داشته باشد)
==============
در واقع چون دستورات linq روی نوع های شمارشی کار میکنند، نتیجتاً همانطور که کاربر kiuhnmgtrdcv نوشتند، یک راست روی آرایه هم قابل اجرا هستند. (هم در vb و هم در #c)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی این نمونه کدها را بیان نکردم چون احساس کردم ذات قدرتمند linq را مشخص نمیکند و در حد یک متد عضو تنزل میدهد.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی اگر میخواهید عناصر غیر تکراری را چاپ کنید باید محتویات x را چاپ کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.