সুতরাং আমার একটি অরসোর্টড সংখ্যাসূচক অ্যারে রয়েছে int[] anArray = { 1, 5, 2, 7 };
এবং আমার অ্যারেতে বৃহত্তম মানের মান এবং সূচক উভয়ই পেতে হবে যা 7 এবং 3 হবে, আমি কীভাবে এটি করব?
সুতরাং আমার একটি অরসোর্টড সংখ্যাসূচক অ্যারে রয়েছে int[] anArray = { 1, 5, 2, 7 };
এবং আমার অ্যারেতে বৃহত্তম মানের মান এবং সূচক উভয়ই পেতে হবে যা 7 এবং 3 হবে, আমি কীভাবে এটি করব?
উত্তর:
এটি সবচেয়ে গ্ল্যামারাস উপায় নয় তবে কাজ করে।
(অবশ্যই থাকতে হবে using System.Linq;
)
int maxValue = anArray.Max();
int maxIndex = anArray.ToList().IndexOf(maxValue);
.ToList()
, অ্যারেগুলি সুস্পষ্টভাবে বাস্তবায়িত করাIList
IList
ইন্টারফেস, কিন্তু তারা যাতে স্পষ্টভাবে করুন: msdn.microsoft.com/en-us/library/... । (অ্যারে সংশ্লিষ্ট জেনেরিক IList<T>
ইন্টারফেসও প্রয়োগ করে ))
ToList()
সর্বদা অনুলিপি করা। পদ্ধতিটি কখনও কখনও অনুলিপি করা এবং কখনও কখনও না করা একটি ভয়ানক ধারণা হবে - এটি বেশ ক্রেজি আলিয়াসিং বাগগুলিতে নিয়ে যায়। আসলে বাস্তবায়ন ToList()
কমবেশিreturn new List(source)
যদি সূচকটি বাছাই করা না থাকে তবে আপনাকে সর্বোচ্চ মান সন্ধান করতে কমপক্ষে একবার অ্যারে দিয়ে পুনরাবৃত্তি করতে হবে। আমি একটি সাধারণ 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;
}
}
এটি লিনকিউ বা অন্য এক-লাইন সমাধানগুলি ব্যবহার করার চেয়ে বেশি ভার্জোজ তবে এটি সম্ভবত কিছুটা দ্রুত। এটি ও (এন) এর চেয়ে দ্রুত করার কোনও উপায় নেই।
maxVal
সূচক 0 তে অ্যারে মানটি শুরু করে (অ্যারে কমপক্ষে দৈর্ঘ্য 1) ধরে index
নিয়ে 0 তে এবং একটি লুপের জন্য শুরু করে একটি পুনরাবৃত্তি সংরক্ষণ করতে পারেন i = 1
।
বাধ্যতামূলক লিংকউইক এক [1] -লাইনার:
var max = anArray.Select((value, index) => new {value, index})
.OrderByDescending(vi => vi.value)
.First();
(বাছাই করা সম্ভবত অন্যান্য সমাধানগুলির চেয়ে কার্যকর পারফরম্যান্স))
[1]: "এক" এর প্রদত্ত মানগুলির জন্য।
একটি সংলগ্ন ওয়ান-লাইনার:
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.
বৈশিষ্ট্য:
মন্তব্য:
anArray.Select((n, i) => ( Index: i, Number: n)).Max()
যেভাবে তুলনা করা হয় তার চেয়ে সর্বোচ্চ সংখ্যার চেয়ে সর্বাধিক সূচকটি সন্ধান করে (আইটেম 1 সর্বাধিক তাৎপর্যপূর্ণ ইত্যাদি)
এখানে দুটি উপায় আছে। অ্যারে খালি থাকার সময় আপনি হ্যান্ডলিং যুক্ত করতে পারেন।
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}");
}
anArray.Select((n, i) => new { Value = n, Index = i })
.Where(s => s.Value == anArray.Max());
বেলো কোডের আউটপুট:
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;
}
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();
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);
}
int[] Data= { 1, 212, 333,2,12,3311,122,23 };
int large = Data.Max();
Console.WriteLine(large);
এখানে একটি লিনকিউ সমাধান রয়েছে যা শালীন ধ্রুবক কারণ সহ ও (এন) হয়:
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
যদি পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে আপনার সত্যই স্পষ্ট লিপ লেখা উচিত ।
ব্যবহার করে অন্য একটি দৃষ্টিকোণ 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
অ্যারের মধ্যে বৃহত্তম এবং ক্ষুদ্রতম সংখ্যাটি সন্ধান করে:
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);
আপনি যদি জানেন যে সর্বোচ্চ মানটি অ্যাক্সেস সর্বোচ্চ মান অবিলম্বে হয়। সুতরাং আপনার যা দরকার তা হ'ল সর্বোচ্চ সূচক।
int max=0;
for(int i = 1; i < arr.Length; i++)
if (arr[i] > arr[max]) max = i;
এটি একটি সি # সংস্করণ। এটি অ্যারে বাছাই করার ধারণার ভিত্তিতে।
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;
}
নিম্নলিখিত বিবেচনা করুন:
/// <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);
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]
সর্বাধিক মানটি ট্র্যাক করার জন্য "সর্বাধিকের সর্বাধিক এবং সূচকটি কীভাবে" দরকার তা আমি বেশিরভাগই দেখতে পেলাম না যদি আপনার একটি অ্যারে থাকে এবং আপনি সর্বাধিক মানের সূচকটি জানেন তবে সর্বোচ্চ মানটির আসল মান অ্যারে সূচক করতে সূচকটি ব্যবহার করার ক্ষেত্রে একটি তুচ্ছ ঘটনা ..