সি # সর্বাধিক অ্যারে মান এবং সূচক সন্ধান করুন


92

সুতরাং আমার একটি অরসোর্টড সংখ্যাসূচক অ্যারে রয়েছে int[] anArray = { 1, 5, 2, 7 };এবং আমার অ্যারেতে বৃহত্তম মানের মান এবং সূচক উভয়ই পেতে হবে যা 7 এবং 3 হবে, আমি কীভাবে এটি করব?


Ive এখনও সর্বোচ্চ () পদ্ধতিটি ব্যবহার করার চেষ্টা করেছিল এবং তারপরে সেই সর্বাধিক মানটির সূচক পেতে বাইনারি অনুসন্ধান পদ্ধতিটি ব্যবহার করে তবে অ্যারেটি সাজানো না হলে এটি কাজ করে না, আমি এটি ব্যবহার করতে পারি না, যখন আমি চেষ্টা করেছিলাম যে এটি আমাকে নেতিবাচক সংখ্যা দিয়েছে
এডমন্ড রোজাস

@ এডমন্ড্রোজাস আপনার বাইনারি অনুসন্ধান ব্যবহার করার দরকার নেই। একটি সরল ওল 'লিনিয়ার অনুসন্ধান অদৃশিত তালিকার জন্য ঠিক কাজ করে।
মিলিমুজ

উত্তর:


144

এটি সবচেয়ে গ্ল্যামারাস উপায় নয় তবে কাজ করে।

(অবশ্যই থাকতে হবে using System.Linq;)

 int maxValue = anArray.Max();
 int maxIndex = anArray.ToList().IndexOf(maxValue);

11
আপনি প্রচুর কোডিংয়ের সময় সাশ্রয় করেছেন তবে আপনি দুবার সংগ্রহটি শেষ করবেন।
গারো ইয়ারিয়াজারিয়ান

11
আপনার এমনকি প্রয়োজন নেই .ToList(), অ্যারেগুলি সুস্পষ্টভাবে বাস্তবায়িত করাIList
মিলিমুজ

@ গারোইরিয়াজারিয়ান যদি আপনার ব্যবহারের ক্ষেত্রে রৈখিক জটিলতা খুব বেশি হয় তবে আপনার সম্ভবত সম্ভবত একটি তৃতীয়াংশের দ্বারা ধ্রুবক উপাদানকে হ্রাস করার চেয়ে আরও বেশি শেভ করা দরকার। (যদিও স্পষ্টতই এটি একটি নগণ্য অপ্টিমাইজেশন নয়।)
মিলিমুজ

4
@ sa_ddam213 অ্যারেগুলির বাস্তবায়ন IListইন্টারফেস, কিন্তু তারা যাতে স্পষ্টভাবে করুন: msdn.microsoft.com/en-us/library/... । (অ্যারে সংশ্লিষ্ট জেনেরিক IList<T>ইন্টারফেসও প্রয়োগ করে ))
মিলিমুজ

4
@ sa_ddam213 না, এর চুক্তিটি ToList()সর্বদা অনুলিপি করা। পদ্ধতিটি কখনও কখনও অনুলিপি করা এবং কখনও কখনও না করা একটি ভয়ানক ধারণা হবে - এটি বেশ ক্রেজি আলিয়াসিং বাগগুলিতে নিয়ে যায়। আসলে বাস্তবায়ন ToList()কমবেশিreturn new List(source)
মিলিমুজ

44
int[] anArray = { 1, 5, 2, 7 };
// Finding max
int m = anArray.Max();

// Positioning max
int p = Array.IndexOf(anArray, m);

28

যদি সূচকটি বাছাই করা না থাকে তবে আপনাকে সর্বোচ্চ মান সন্ধান করতে কমপক্ষে একবার অ্যারে দিয়ে পুনরাবৃত্তি করতে হবে। আমি একটি সাধারণ forলুপ ব্যবহার করব :

int? maxVal = null; //nullable so this works even if you have all super-low negatives
int index = -1;
for (int i = 0; i < anArray.Length; i++)
{
  int thisNum = anArray[i];
  if (!maxVal.HasValue || thisNum > maxVal.Value)
  {
    maxVal = thisNum;
    index = i;
  }
}

এটি লিনকিউ বা অন্য এক-লাইন সমাধানগুলি ব্যবহার করার চেয়ে বেশি ভার্জোজ তবে এটি সম্ভবত কিছুটা দ্রুত। এটি ও (এন) এর চেয়ে দ্রুত করার কোনও উপায় নেই।


4
আপনি maxValসূচক 0 তে অ্যারে মানটি শুরু করে (অ্যারে কমপক্ষে দৈর্ঘ্য 1) ধরে indexনিয়ে 0 তে এবং একটি লুপের জন্য শুরু করে একটি পুনরাবৃত্তি সংরক্ষণ করতে পারেন i = 1
জন স্নাইডার

14

বাধ্যতামূলক লিংকউইক এক [1] -লাইনার:

var max = anArray.Select((value, index) => new {value, index})
                 .OrderByDescending(vi => vi.value)
                 .First();

(বাছাই করা সম্ভবত অন্যান্য সমাধানগুলির চেয়ে কার্যকর পারফরম্যান্স))

[1]: "এক" এর প্রদত্ত মানগুলির জন্য।


14
এই সমাধানটি যুক্ত করার জন্য সর্বোত্তমভাবে ও (এনলগন) জটিলতা রয়েছে। অরসোর্টড অ্যারের জন্য সর্বাধিক সন্ধান করা ও (এন) সময়ে পাওয়া যাবে।
ডপপ্লসোল্ডার

13

একটি সংলগ্ন ওয়ান-লাইনার:

var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();

পরীক্ষা ক্ষেত্রে:

var anArray = new int[] { 1, 5, 2, 7 };
var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();
Console.WriteLine($"Maximum number = {max.Number}, on index {max.Index}.");
// Maximum number = 7, on index 4.

বৈশিষ্ট্য:

  • লিনক ব্যবহার করুন (ভ্যানিলা হিসাবে অপ্টিমাইজড নয়, তবে ট্রেড-অফ কম কোড)।
  • বাছাই করার দরকার নেই।
  • গণনামূলক জটিলতা: ও (এন)।
  • স্থান জটিলতা: ও (এন)।

মন্তব্য:

  • নিশ্চিত করুন যে সংখ্যাটি (এবং সূচকটি নয়) টিউপলের প্রথম উপাদান কারণ টিপল বাছাই করা হয় বাম থেকে ডানদিকে টিপল আইটেমের তুলনা করে।

এটা সত্যিই ঝরঝরে !!
ফ্লোহিল্ড 16

এটি লক্ষ করা উচিত যে এটি কাজ করার জন্য, আইটেমটি সর্বোচ্চভাবে হওয়া উচিত
কায়ুস জার্ড

আপনি কিউইউস জার্ড বলতে কী বোঝাতে চাইছেন? পরীক্ষার ক্ষেত্রে প্রদর্শিত হিসাবে, সর্বাধিক আইটেমটি সঠিকভাবে পাওয়া গেছে এবং এটি শেষ ছিল।
লেসেইয়ার ভালমন্ট

টুপলে প্রথমে, উদাহরণস্বরূপ, টিউপলগুলি anArray.Select((n, i) => ( Index: i, Number: n)).Max()যেভাবে তুলনা করা হয় তার চেয়ে সর্বোচ্চ সংখ্যার চেয়ে সর্বাধিক সূচকটি সন্ধান করে (আইটেম 1 সর্বাধিক তাৎপর্যপূর্ণ ইত্যাদি)
জার্ড

যথেষ্ট পরিমাণে কায়ুসজার্ড, আমি এটি উল্লেখ করার জন্য একটি মন্তব্য যুক্ত করেছি। ধন্যবাদ
লেসায়ার ভালমন্ট

3

এখানে দুটি উপায় আছে। অ্যারে খালি থাকার সময় আপনি হ্যান্ডলিং যুক্ত করতে পারেন।

public static void FindMax()
{
    // Advantages: 
    // * Functional approach
    // * Compact code
    // Cons: 
    // * We are indexing into the array twice at each step
    // * The Range and IEnumerable add a bit of overhead
    // * Many people will find this code harder to understand

    int[] array = { 1, 5, 2, 7 };

    int maxIndex = Enumerable.Range(0, array.Length).Aggregate((max, i) => array[max] > array[i] ? max : i);
    int maxInt = array[maxIndex];

    Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}");
}

public static void FindMax2()
{
    // Advantages: 
    // * Near-optimal performance

    int[] array = { 1, 5, 2, 7 };
    int maxIndex = -1;
    int maxInt = Int32.MinValue;

    // Modern C# compilers optimize the case where we put array.Length in the condition
    for (int i = 0; i < array.Length; i++)
    {
        int value = array[i];
        if (value > maxInt)
        {
            maxInt = value;
            maxIndex = i;
        }
    }

    Console.WriteLine($"Maximum int {maxInt} is found at index {maxIndex}");
}

1
anArray.Select((n, i) => new { Value = n, Index = i })
    .Where(s => s.Value == anArray.Max());

এটি একটি ও (এন ^ 2) সমাধান, কারণ আপনি প্রতিটি পুনরাবৃত্তিতে anArray.Max () গণনা করছেন। এটি বড় অ্যারেগুলির জন্য খুব ধীরে পাবে।
নীল

1
int[] numbers = new int[7]{45,67,23,45,19,85,64}; 
int smallest = numbers[0]; 
for (int index = 0; index < numbers.Length; index++) 
{ 
 if (numbers[index] < smallest) smallest = numbers[index]; 
} 
Console.WriteLine(smallest);

1

বেলো কোডের আউটপুট:

00: 00: 00.3279270 - সর্বোচ্চ 1 00: 00: 00.2615935 - ম্যাক্স 2 00: 00: 00.6010360 - ম্যাক্স 3 (অ্যারারম্যাক্স ())

অ্যারে 100000000 ints খুব বড় পার্থক্য নয় তবুও ...

class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[100000000];

            Random randNum = new Random();
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = randNum.Next(-100000000, 100000000);
            }
            Stopwatch stopwatch1 = new Stopwatch();
            Stopwatch stopwatch2 = new Stopwatch();
            Stopwatch stopwatch3 = new Stopwatch();
            stopwatch1.Start();

            var max = GetMaxFullIterate(arr);

            Debug.WriteLine( stopwatch1.Elapsed.ToString());


            stopwatch2.Start();
            var max2 = GetMaxPartialIterate(arr);

            Debug.WriteLine( stopwatch2.Elapsed.ToString());

            stopwatch3.Start();
            var max3 = arr.Max();
            Debug.WriteLine(stopwatch3.Elapsed.ToString());

        }



 private static int GetMaxPartialIterate(int[] arr)
        {
            var max = arr[0];
            var idx = 0;
            for (int i = arr.Length / 2; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }

                if (arr[idx] > max)
                {
                    max = arr[idx];
                }
                idx++;
            }
            return max;
        }


        private static int GetMaxFullIterate(int[] arr)
        {
            var max = arr[0];
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }
            }
            return max;
        }

1
 public static class ArrayExtensions
{
    public static int MaxIndexOf<T>(this T[] input)
    {
        var max = input.Max();
        int index = Array.IndexOf(input, max);
        return index;
    }
}

এটি সমস্ত পরিবর্তনশীল ধরণের জন্য কাজ করে ...

var array = new int[]{1, 2, 4, 10, 0, 2};
var index = array.MaxIndexOf();


var array = new double[]{1.0, 2.0, 4.0, 10.0, 0.0, 2.0};
var index = array.MaxIndexOf();

1
public static void Main()
{
    int a,b=0;
    int []arr={1, 2, 2, 3, 3, 4, 5, 6, 5, 7, 7, 7, 100, 8, 1};

    for(int i=arr.Length-1 ; i>-1 ; i--)
        {
            a = arr[i];

            if(a > b)
            {
                b=a;    
            }
        }
    Console.WriteLine(b);
}

0
int[] Data= { 1, 212, 333,2,12,3311,122,23 };
int large = Data.Max();
Console.WriteLine(large);

4
আপনার উত্তরটি কেবলমাত্র সর্বোচ্চ মান দেয় তবে প্রশ্নকারী সর্বোচ্চ মানের এবং সর্বোচ্চ মানের সূচক উভয়ের জন্য অনুরোধ করে।
কার্ডিন

0

এখানে একটি লিনকিউ সমাধান রয়েছে যা শালীন ধ্রুবক কারণ সহ ও (এন) হয়:

int[] anArray = { 1, 5, 2, 7, 1 };

int index = 0;
int maxIndex = 0;

var max = anArray.Aggregate(
    (oldMax, element) => {
        ++index;
        if (element <= oldMax)
            return oldMax;
        maxIndex = index;
        return element;
    }
);

Console.WriteLine("max = {0}, maxIndex = {1}", max, maxIndex);

আপনি forযদি পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে আপনার সত্যই স্পষ্ট লিপ লেখা উচিত ।


0

ব্যবহার করে অন্য একটি দৃষ্টিকোণ DataTable। কল DataTableহওয়া 2 কলাম সহ একটি ঘোষণা করুন indexএবং val। কলামে একটি AutoIncrementবিকল্প এবং উভয় AutoIncrementSeedএবং AutoIncrementStepমান যুক্ত 1করুন index। তারপরে একটি foreachলুপ ব্যবহার করুন এবং প্রতিটি অ্যারে আইটেমটি datatableসারি হিসাবে .োকান। তারপরে Selectপদ্ধতিটি ব্যবহার করে সর্বাধিক মানযুক্ত নির্বাচন করুন।

কোড

int[] anArray = { 1, 5, 2, 7 };
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[2] { new DataColumn("index"), new DataColumn("val")});
dt.Columns["index"].AutoIncrement = true;
dt.Columns["index"].AutoIncrementSeed = 1;
dt.Columns["index"].AutoIncrementStep = 1;
foreach(int i in anArray)
    dt.Rows.Add(null, i);

DataRow[] dr = dt.Select("[val] = MAX([val])");
Console.WriteLine("Max Value = {0}, Index = {1}", dr[0][1], dr[0][0]);

আউটপুট

Max Value = 7, Index = 4

এখানে একটি ডেমো সন্ধান করুন


0

অ্যারের মধ্যে বৃহত্তম এবং ক্ষুদ্রতম সংখ্যাটি সন্ধান করে:

int[] arr = new int[] {35,28,20,89,63,45,12};
int big = 0;
int little = 0;

for (int i = 0; i < arr.Length; i++)
{
    Console.WriteLine(arr[i]);

    if (arr[i] > arr[0])
    {
        big = arr[i];
    }
    else
    {
        little = arr[i];

    }
}

Console.WriteLine("most big number inside of array is " + big);
Console.WriteLine("most little number inside of array is " + little);

4
এটি সর্বনিম্ন মানটি / অ্যারে প্রথম মানের চেয়ে বড় / ছোট যা ফিরে আসতে চলেছে, ন্যূনতম / সর্বোচ্চ নয়।
টোমর ওলবার্গ

0

আপনি যদি জানেন যে সর্বোচ্চ মানটি অ্যাক্সেস সর্বোচ্চ মান অবিলম্বে হয়। সুতরাং আপনার যা দরকার তা হ'ল সর্বোচ্চ সূচক।

int max=0;

for(int i = 1; i < arr.Length; i++)
    if (arr[i] > arr[max]) max = i;

0

এটি একটি সি # সংস্করণ। এটি অ্যারে বাছাই করার ধারণার ভিত্তিতে।

public int solution(int[] A)
 {
    // write your code in C# 6.0 with .NET 4.5 (Mono)
    Array.Sort(A);
    var max = A.Max();
    if(max < 0)
        return 1;
    else
        for (int i = 1; i < max; i++)
        {
            if(!A.Contains(i)) {
                return i;
            }
        }
    return max + 1;
}


0

নিম্নলিখিত বিবেচনা করুন:

    /// <summary>
    /// Returns max value
    /// </summary>
    /// <param name="arr">array to search in</param>
    /// <param name="index">index of the max value</param>
    /// <returns>max value</returns>
    public static int MaxAt(int[] arr, out int index)
    {
        index = -1;
        int max = Int32.MinValue;

        for (int i = 0; i < arr.Length; i++)
        {
            if (arr[i] > max)
            { 
                max = arr[i];
                index = i;
            }
        }

        return max;
    }

ব্যবহার:

int m, at;
m = MaxAt(new int[]{1,2,7,3,4,5,6}, out at);
Console.WriteLine("Max: {0}, found at: {1}", m, at);

0

forযদি আমরা গল্ফের দিকে যাচ্ছি তবে এটি একটি শারীরিক লুপ দিয়ে করা যেতে পারে ;)

//a is the array


int mi = a.Length - 1;
for (int i=-1; ++i<a.Length-1; mi=a[mi]<a[i]?i:mi) ;

++i<a.Length-1সর্বশেষ সূচকটি পরীক্ষা করে বাদ দেওয়া হবে। আমরা এটি সেট আপ করি না যদি আমরা এটি সেট আপ করি যেমন সর্বাধিক সূচক শেষ সূচক যা শুরু হয় .. যখন লুপটি অন্য উপাদানগুলির জন্য সঞ্চালিত হয় এটি শেষ হবে এবং একটি বা অন্য জিনিসটি সত্য:

  • আমরা একটি নতুন সর্বোচ্চ মান এবং তাই একটি নতুন সর্বোচ্চ সূচক পেয়েছি mi
  • সর্বশেষ সূচকটি ছিল সর্বোপরি সর্বাধিক মান, সুতরাং আমরা একটি নতুন খুঁজে পাইনি miএবং আমরা প্রাথমিকটির সাথে আটকে গেলামmi

আসল কাজটি পোস্ট-লুপ মডিফায়ার দ্বারা সম্পন্ন করা হয়:

  • আমরা এখনও অবধি সর্বাধিক মান ( a[mi]অর্থাত্ অ্যারে অনুসারে সূচিত mi) পেয়েছি, বর্তমান আইটেমের চেয়ে কম?
    • হ্যাঁ, তারপরে একটি নতুন সঞ্চয় miকরে রাখুন i,
    • না তবে বিদ্যমান mi(কোনও বিকল্প) সংরক্ষণ করুন

ক্রিয়াকলাপ শেষে আপনার সূচক রয়েছে যেখানে সর্বাধিক সন্ধান করা হবে। যৌক্তিকভাবে তারপর সর্বোচ্চ মান হয়a[mi]

সর্বাধিক মানটি ট্র্যাক করার জন্য "সর্বাধিকের সর্বাধিক এবং সূচকটি কীভাবে" দরকার তা আমি বেশিরভাগই দেখতে পেলাম না যদি আপনার একটি অ্যারে থাকে এবং আপনি সর্বাধিক মানের সূচকটি জানেন তবে সর্বোচ্চ মানটির আসল মান অ্যারে সূচক করতে সূচকটি ব্যবহার করার ক্ষেত্রে একটি তুচ্ছ ঘটনা ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.