PDA

View Full Version : سوال: پیدا کردن نزدیکترین عدد به مجموعه



a.maleki
یک شنبه 27 دی 1388, 18:28 عصر
سلام
فرض کنید یک سری عدد داریم که این اعداد یک عدد مبدا دارند که از آن شروع به خواندن می کنه حالا چطور میتونیم عددی که در این مجموعه قرار داره به عدد مد نظر ما نزدیکتره را پیدا کنم

مثلا مجموعه اعداد ما هستش (98 183 37 122 14 124 65 67)
حالا عدد مبدا شروع ما هستش 53 حالا من چطوری باید تو این آرایه عددی بگردم نزدکترین عدد
به 53 که 37 هستش رو پیدا کنم

خیلی خیلی ممونم میشم که من را راهنمائی کنید

مهدی نان شکری
دوشنبه 28 دی 1388, 16:44 عصر
با سلام
یه چیزی شبیه این باید لازمتون باشه البته ممکنه ایراد هم داشته باشه.


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim array() As Integer = {98, 183, 37, 122, 14, 124, 65, 67}
MsgBox(getElement(array, 53, 0, array.Length - 1))
End Sub

Private Function getElement(ByVal iList() As Integer, ByVal input As Integer, ByVal min As Integer, ByVal max As Integer) As Integer
Array.Sort(iList)
Dim Mid As Integer = Math.Floor((max - min) / 2) + min
If max = min Then
Return iList(max)
End If
If iList(Mid) = input Then
Return iList(Mid)
End If
If iList(Mid + 1) = input Then
Return iList(Mid + 1)
End If
If iList(Mid) < input AndAlso iList(Mid + 1) > input Then
If input - iList(Mid) < iList(Mid + 1) - input Then
Return iList(Mid)
ElseIf input - iList(Mid) = iList(Mid + 1) - input Then
Return iList(Mid)
Else
Return iList(Mid + 1)
End If
End If
If iList(Mid) < input Then
min = Mid
max = iList.Length - 1
Else
min = 0
max = Mid
End If
Return getElement(iList, input, min, max)
End Function

در ضمن جواب مثال بالا نباید 65 باشه؟

a.maleki
چهارشنبه 30 دی 1388, 16:59 عصر
دوست عزیز ممنون از جوابت ولی این دستور شما یکبار فقط عدد 65 رو می ده در صورتی که من به ترتیب بعد از 65 اعداد 67 و37و14و98و122و124و183 را می خواهم داشته باشم

ممنون میشم کمک کنید

مهدی نان شکری
چهارشنبه 30 دی 1388, 21:59 عصر
با سلام
در آن صورت الگوریتم بالا به کارتون نمیاد.
این رو تست کنین ولی باید یه الگوریتم خوب برای مرتب سازی براش بنویسین.



Private Function getElement(ByRef iList() As Integer, ByVal i As Integer) As Integer
Dim mhd(iList.Length - 1, 1) As Integer
For index As Integer = 0 To iList.Length - 1
mhd(index, 0) = iList(index)
mhd(index, 1) = Math.Abs(iList(index) - i)
Next
sort(mhd)
For k As Integer = 0 To mhd.Length / 2 - 1
MsgBox(mhd(k, 0))
Next
End Function

Private Sub sort(ByRef array(,) As Integer)
Dim tmp1 As Integer = 0
Dim tmp2 As Integer = 0

For i As Integer = 0 To array.Length / 2 - 1
For j As Integer = 0 To array.Length / 2 - 1
If array(i, 1) < array(j, 1) Then
tmp1 = array(i, 0)
tmp2 = array(i, 1)
array(i, 0) = array(j, 0)
array(i, 1) = array(j, 1)
array(j, 0) = tmp1
array(j, 1) = tmp2
End If
Next
Next
End Sub

Alghoochi
چهارشنبه 30 دی 1388, 23:28 عصر
بهتر نیست اول آرایه رو مرتب کنی بعد جستجو کنی.

مهدی نان شکری
پنج شنبه 01 بهمن 1388, 09:37 صبح
با سلام
در الگوریتم بالا نه. چون ما بر اساس قدر مطلق تفاضل نیاز به ترتیب داریم نه بر اساس خود آیتم ها. و باید بعد از پیدا کردن تفاضل دوباره مرتب شود.
در ضمن الگوریتم اولی برای کار دوم مناسب نخواهد بود زیرا هزینه اجرایی خوبی نخواهد داشت.
ولی برای مورد اول بهتر از الگوریتم دوم خواهد بود.
باز منتظر نظر دوستان هستیم.