تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 10 از 10

نام تاپيک: حذف عناصر تکراری از یک ارایه؟

  1. #1
    اگه نباشه جاش خالی می مونه kiuhnmgtrdcv's Avatar
    تاريخ عضويت
    Mar 2008
    پست ها
    343

    14 حذف عناصر تکراری از یک ارایه؟

    سلام دوستان من یک ارایه 100000 عنصری دارم که 100000 تا عدد تصادفی توی این ارایه ریختم مثلا اعداد تو بازه 001000 تا 999999
    میخوام ببینم چطور میتونم عناصر تکراری رو از این ارایه پاک کنم؟ من اگر بیام یه ارایه دیگه درست کنم بعد بیام عناصر ارایه اولی را تو بریزم بعد ارایه دومی رو با اولی مقایسه کنم این کار عاقلانه ای هست؟ چون تعداد اعداد زیاده اگر بخوام اینطوری مقایسه کنم که اول اعداد درون ارایه رو مرتب کنم در اینصورت ترتیب اعداد تصادفی بهم میریزه ؟

  2. #2
    آخر فروم باز hamidreza_buddy's Avatar
    تاريخ عضويت
    Sep 2004
    محل سكونت
    شریف
    پست ها
    1,167

    پيش فرض

    اگه عناصرت توی بازه خاصی باشه می تونی یه آرایه با اون بازه درست کنی (با مقدار اولیه صفر) بعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی.
    در آخر هم چک کنی هر کدوم از عناصر آرایه دوم «یک» شده بودند اون عنصر تو آرایه یک یا بیشتر تکرار شده و می تونی توی آرایه نتیجه اون رو بریزی.
    مثلاً توی مسئله شما، یه آرایه به اندازه 999999 درست کن به نام mark. بعد مقدار یه عنصر از آرایه اول رو بخون و با اندایس تو آرایه mark رو یک کن.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    در آخر هم توی یه حلقه توی mark بگرد و اونایی رو که «یک» هستند رو توی آرایه result بریز.

  3. #3
    اگه نباشه جاش خالی می مونه kiuhnmgtrdcv's Avatar
    تاريخ عضويت
    Mar 2008
    پست ها
    343

    پيش فرض

    بعد اگه توی آرایه اولت یه عدد باشه همون رو توی آرایه دوم یک کنی.
    ببخشید من منظور شما رو از این جمله نفهمیدم یک کردن یعنی چی؟ چطوری؟

  4. #4
    آخر فروم باز hamidreza_buddy's Avatar
    تاريخ عضويت
    Sep 2004
    محل سكونت
    شریف
    پست ها
    1,167

    پيش فرض

    همون کدی که تو پست قبل گذاشتم رو نیگا بنداز.
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

    در اینجا آرایه وسطی mark هست که به ازای هر عدد یه عنصر داره و اگه یک یا بیشتر از اون عدد تو آرایه array موجود باشه یک می شه و اگه موجود نباشه همون صفر باقی می مونه.
    پس در آخر می تونیم عناصری از آرایه mark رو که یک هستند رو انتخاب کنیم. مثلاً در شکل بالا 1 و 3 و 4 یک هستند. در نتیجه اون ها رو توی آرایه نتیجه قرار می دهیم (چون برای ما تعداد تکرار های یک عدد مهم نیست و فقط مهم اینه که آیا یک عدد موجود بوده یا نه)

  5. #5
    اگه نباشه جاش خالی می مونه kiuhnmgtrdcv's Avatar
    تاريخ عضويت
    Mar 2008
    پست ها
    343

    پيش فرض

    سلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد

  6. #6
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    با اجازه دوستم عزیزم جناب hamidreza_buddy
    اگر آرایه های مرتب شده باشند یا مرتب بشوند کار خیلی ساده تر است وگرنه باید به ازای هر آیتم اعضای تا آن نقطهرا اسکن کنید.

    ولی در اصل چیز دیگری را میخواستم بگویم این نبود!...
    اگر هدفتان الگوریتم نویسی و آزمایشی و... نیست با امکانات فوق العاده قدرتمند LINQ شما قاد خواهید این اعمال به سادگی و بدون نگرانی از الگوریتم و... بنویسید و قوای فکری خود را روی مسائل مهم تر متمرکز کنید.

    مثلاً ارایه زیر را داریم...
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    (جالب این است که میتواند اصلاً آرایه نباشد، و هر لیست قابل شمارشی مجاز است و حتی این لیست شمارشی میتواند یک ساختار structure یا class باشد)

    دستورات LINQ رای دیتای فوق:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    این دستورات فوق العاده ساده و بچه گانه linq هستند و group و join و Where و... میتوان روی ساختارهای تو در توی شمارشی اعمال کرد و خروجی شمارشی یک بلوک linq را خوراک ورودی یک دستور دیگرش کرد....

    همانطور که مشاهده کردید حذف آیتم های تکراری فقط یک خط کد میشود!
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    =====

    این روش صنعتی است که مایکروسافت در دات پیشنهاد داده و تا حالا در هیچ زبان برنامه نویسی واقعی سابقه نداشته و در انحصار زبان دیتابیسی sql بوده.
    همانطور که دیگر برنامه نویسان به نوشتن رکوردی فایل ها و ذخیره و بازیابی اطلاعات در فایل توجه زیادی نمیکنند و آن را به موتورهای بانک های رابطه ای میسپارند، همین وضع در بخش های دیگر هم وجود دارد تا فکر برنامه نویس را از جزئیات و +1 و -1 آزاد کند.


    =====

    البته حالا که تایپ مطالب تمام کردم، دلم نیامد یاد ایام جوانی و ++C را نکنم!
    در نتیجه بدون LINQ (و بیشتر برای علاقه خودم) کد زیر را برای حذف عناصر تکراری نوشتم.
    (
    طبیعتاً اگر سعی کنید خودتان کدنویسی کنید و متوجه هم شوید خیلی بهتر و بنیادین تر است، میتوانید روی پیاده سازی الگوریتم جناب hamidreza_buddy فکر کنید، چیزی که خودتان با صرف روزها کار به آن برسد به نظر من بسیار ارزشمند تر از کپی برداری است.
    )
    نتیجه آرایه ای جدید است که تعداد اعضای اصلی آن iCount خواهد بود.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    (کد اول VB.Net بود و دومی C#.Net ، به این میگن انصاف در کدنویسی!!!! )

  7. 4 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


  8. #7
    آخر فروم باز hamidreza_buddy's Avatar
    تاريخ عضويت
    Sep 2004
    محل سكونت
    شریف
    پست ها
    1,167

    پيش فرض

    سلام جناب H2. خوب هستین شما؟!

    این LINQ که گفتین فقط تو vb.net موجوده؟

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    (کد اول VB.Net بود و دومی C#.Net ، به این میگن انصاف در کدنویسی!!!! )

    این کدی که گذاشتین از مرتبه o(n^2) و با توجه به اندازه بزرگ آرایه در مسئله دوست ما فکر کنم عملی نباشه!

    البته تو دات نت گرفتن یه آرایه 1 میلیون عنصری ممکنه؟

  9. این کاربر از hamidreza_buddy بخاطر این مطلب مفید تشکر کرده است


  10. #8
    آخر فروم باز hamidreza_buddy's Avatar
    تاريخ عضويت
    Sep 2004
    محل سكونت
    شریف
    پست ها
    1,167

    پيش فرض

    سلام دوباره من سعی کردم چیزایی که شما گفتید رو به کد تبدیل کنم ببنید درسته یا نه
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    خواستم کدو مستقیم اینجا کپی پست کنم ولی چپ به راستش همش خراب میشد
    توی تگ کد کپی کنید کدتون رو:

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    code* ها رو بدون ستاره بنویس.
    کدتون این بود:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    آره. ولی اگه به جای جمع با یک فقط اون رو مساوی یک هم قرار بدی فرقی نمی کنه.
    آخرش هم این کد رو می گذارید:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

  11. #9
    اگه نباشه جاش خالی می مونه kiuhnmgtrdcv's Avatar
    تاريخ عضويت
    Mar 2008
    پست ها
    343

    پيش فرض

    [RIGHT]h2 جان من این کدو نوشتم مرسی از راهنمایی همچینن hamidreza_buddy
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    hamidreza_buddy ببین یاد گرفتم کد بزارم
    Last edited by kiuhnmgtrdcv; 23-10-2008 at 19:12.

  12. #10
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    این LINQ که گفتین فقط تو vb.net موجوده؟
    همانطور که میدانید امکانات دات نت در انحصار زبان خاصی نیست ولی در انحصار دات نت است!!!!!

    معمولاً تمام دستورات VB.Net و C#.Net به راحتی قابل تبدیل به هم هستند.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    این کدی که گذاشتین از مرتبه o(n^2) و با توجه به اندازه بزرگ آرایه در مسئله دوست ما فکر کنم عملی نباشه!
    البته تو دات نت گرفتن یه آرایه 1 میلیون عنصری ممکنه؟
    در واقع اون کد را بیشتر برای خودم نوشتم!
    اون کد به تخصیص آرایه ای برابر با آرایه اولیه نیاز دارد و دو حلقه تودر توی آن در بدترین شرایط به اندازه یک حلقه واحد n(n-1)/2 شمارشی خواهد بود.
    مثلاً برای آرایه ای 10 هزار عضوی نیاز به یک آرایه دیگر 10 هزار عضوی دارد و در بدترین شرایط حلقه 50 میلیون بار اجرا میشود !!!
    برای یک میلیون عضو، تخصیص آرایه 1 میلیون عضوی مشکلی شاید نداشته باشد ولی حلقه 500 میلیاردی (در بدترین شرایط) من بدون شک یک کم برنامه را کند میکند!!! (البته linq هم نمیتواند روی آرایه یک میلون عنصری سرعت بالایی داشته باشد)
    ==============

    در واقع چون دستورات linq روی نوع های شمارشی کار میکنند، نتیجتاً همانطور که کاربر kiuhnmgtrdcv نوشتند، یک راست روی آرایه هم قابل اجرا هستند. (هم در vb و هم در #c)
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ولی این نمونه کدها را بیان نکردم چون احساس کردم ذات قدرتمند linq را مشخص نمیکند و در حد یک متد عضو تنزل میدهد.


    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ولی اگر میخواهید عناصر غیر تکراری را چاپ کنید باید محتویات x را چاپ کنید.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    Last edited by _H2_; 24-10-2008 at 15:01.

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •