واضح آرشیو وب فارسی:سایت ریسک: kiuhnmgtrdcv21-10-2008, 04:28 PMسلام دوستان من یک ارایه 100000 عنصری دارم که 100000 تا عدد تصادفی توی این ارایه ریختم مثلا اعداد تو بازه 001000 تا 999999 میخوام ببینم چطور میتونم عناصر تکراری رو از این ارایه پاک کنم؟ من اگر بیام یه ارایه دیگه درست کنم بعد بیام عناصر ارایه اولی را تو بریزم بعد ارایه دومی رو با اولی مقایسه کنم این کار عاقلانه ای هست؟ چون تعداد اعداد زیاده اگر بخوام اینطوری مقایسه کنم که اول اعداد درون ارایه رو مرتب کنم در اینصورت ترتیب اعداد تصادفی بهم میریزه ؟ hamidreza_buddy22-10-2008, 01:37 AMاگه عناصرت توی بازه خاصی باشه می تونی یه آرایه با اون بازه درست کنی (با مقدار اولیه صفر) بعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی. در آخر هم چک کنی هر کدوم از عناصر آرایه دوم «یک» شده بودند اون عنصر تو آرایه یک یا بیشتر تکرار شده و می تونی توی آرایه نتیجه اون رو بریزی. مثلاً توی مسئله شما، یه آرایه به اندازه 999999 درست کن به نام mark. بعد مقدار یه عنصر از آرایه اول رو بخون و با اندایس تو آرایه mark رو یک کن. !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! در آخر هم توی یه حلقه توی mark بگرد و اونایی رو که «یک» هستند رو توی آرایه result بریز. kiuhnmgtrdcv22-10-2008, 09:56 AMبعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی. ببخشید من منظور شما رو از این جمله نفهمیدم یک کردن یعنی چی؟ چطوری؟ hamidreza_buddy22-10-2008, 10:29 PMهمون کدی که تو پست قبل گذاشتم رو نیگا بنداز. http://www.freeimagehosting.net/uploads/bd 3384003e.jpg (http://www.freeimagehosting.net/) در اینجا آرایه وسطی mark هست که به ازای هر عدد یه عنصر داره و اگه یک یا بیشتر از اون عدد تو آرایه array موجود باشه یک می شه و اگه موجود نباشه همون صفر باقی می مونه. پس در آخر می تونیم عناصری از آرایه mark رو که یک هستند رو انتخاب کنیم. مثلاً در شکل بالا 1 و 3 و 4 یک هستند. در نتیجه اون ها رو توی آرایه نتیجه قرار می دهیم (چون برای ما تعداد تکرار های یک عدد مهم نیست و فقط مهم اینه که آیا یک عدد موجود بوده یا نه) kiuhnmgtrdcv23-10-2008, 11:05 AMسلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه http://www.mediafire.com/?dtgtbt1ymmx خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد:31: _H2_23-10-2008, 11:09 AMسلام با اجازه دوستم عزیزم جناب 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_buddy23-10-2008, 03:07 PMسلام جناب H2. خوب هستین شما؟! این LINQ که گفتین فقط تو vb.net موجوده؟ !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! (کد اول VB.Net بود و دومی C#.Net ، به این میگن انصاف در کدنویسی!!!! :31:) این کدی که گذاشتین از مرتبه o(n^2) و با توجه به اندازه بزرگ آرایه در مسئله دوست ما فکر کنم عملی نباشه! البته تو دات نت گرفتن یه آرایه 1 میلیون عنصری ممکنه؟ hamidreza_buddy23-10-2008, 03:14 PMسلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه http://www.mediafire.com/?dtgtbt1ymmx خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد:31: توی تگ کد کپی کنید کدتون رو: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! code* ها رو بدون ستاره بنویس. کدتون این بود: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! آره. ولی اگه به جای جمع با یک فقط اون رو مساوی یک هم قرار بدی فرقی نمی کنه. آخرش هم این کد رو می گذارید: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! kiuhnmgtrdcv23-10-2008, 07:08 PMh2 جان من این کدو نوشتم مرسی از راهنمایی همچینن hamidreza_buddy !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! [RIGHT]hamidreza_buddy ببین یاد گرفتم کد بزارم :31: _H2_24-10-2008, 02:35 PMسلام این 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 را چاپ کنید. !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 5134]