- PR -

[VB.NET] 指定の数値群より近似値を求める方法

投稿者投稿内容
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-12 13:33
と、すいませんVB.NETでしたね。
コード:
    Private Function GetApproximateValue(ByVal array As Integer(), ByVal value As Integer) As Integer
        array.Sort(array)
        Dim index As Integer = array.BinarySearch(array, value)
        If (index < 0) Then
            index = Math.Abs(index) - 1
            If ((index < array.Length) AndAlso (index > 0)) Then
                If (Math.Abs(value - array(index - 1)) <= Math.Abs(value - array(index))) Then
                    index = index - 1
                End If
            ElseIf (index >= array.Length) Then
                index = array.Length - 1
            End If
        End If
        Return array(index)
    End Function

まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-05-12 13:38
引用:

#Dim n() As Integer
n.Sort()


おっと、インスタンスメンバでしたね。。。
Array.Sort(n)
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2006-05-12 13:54
みなさん、たくさんのご意見ありがとうございます。
色々と大変参考になりました。

一応、投稿後に自分で作成したものは下記のようなものです。
究極超人さんの意見に近いのかな・・・?

"Dim tmp As Integer = 20"初回に比較する内容がないために
仮に20以上の差が出ないことを前提と考えてやってみました。
最終的にはこの条件は省いてしまいたいと思ってます。
"SizeList"はArrayListを使って生成しました。

-------------------------------------------------------------------------------
GetBestSize(size As Integer) As Integer
Dim dif As Integer
Dim tmp As Integer = 20
Dim ret As Integer

If IsNothing(Sizelist) Then
Return size
End If

If Sizelist.Contains(size) Then
Return size
End If

For Each BaseSize As Integer In m_FontSizelist
dif = Math.Abs(size - BaseSize)
If tmp > dif Then
tmp = dif
ret = BaseSize
End If
Next

Return ret
--------------------------------------------------------------------------------

BinarySearchについては仕様をあまり理解していなかったので、これを期に勉強してみようと思います。
ありがとうございました。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-12 14:44
引用:

KIMERAさんの書き込み (2006-05-12 13:54) より:

一応、投稿後に自分で作成したものは下記のようなものです。
究極超人さんの意見に近いのかな・・・?


僕のことでしょうか?w
ソートされているならバイナリサーチが速いとは思ったのですが、そういう前提条件
がないなら、一旦ソートしてバイナリサーチするより、直接舐めちゃった方が速い筈
です。

#ソートメソッドが中で何をやっているのか知りませんが
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-12 15:22
KIMERAさんのコードでは、差分が同値の場合に比較値(ここでは数値群)の大小が
考慮されていないので
ソートされていることが前提条件になると思いますよ?
例えば、
数値群{10, 12, 6}で
8を指定した場合、戻り値は10
になりませんか?

#修正
0への距離が考慮されてないので
-> 差分が同値の場合に比較値(ここでは数値群)の大小が

[ メッセージ編集済み 編集者: うにくま 編集日時 2006-05-12 15:48 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-12 15:42
引用:

うにくまさんの書き込み (2006-05-12 15:22) より:

KIMERAさんのコードでも0への距離が考慮されてないので


0への距離の意味が良くわかませんでした( ̄ ̄?)

引用:

うにくまさんの書き込み (2006-05-12 15:22) より:

例えば、
数値群{10, 12, 6}で
8を指定した場合、戻り値は10
になりませんか?



戻り値は、10になると思います。
しかし、ソートされていることが前提である理由にはならないように思います。

すみません。結構悩んでみたんですが。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-05-12 15:52
以下が条件なので、
引用:

KIMERAさんの書き込み (2006-05-12 11:27) より:

数値群{8,9,10,14,16,20}

10を指定した場合は10が返る
11を指定した場合は10が返る
12を指定した場合は10が返る(同じ近似値がある場合[10,14]小さい方を優先する)


先ほどの例では、6が期待する結果になると思います。

[ メッセージ編集済み 編集者: うにくま 編集日時 2006-05-12 15:56 ]
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-05-12 16:13
引用:

R・田中一郎さんの書き込み (2006-05-12 14:44) より:
#ソートメソッドが中で何をやっているのか知りませんが


http://msdn2.microsoft.com/ja-JP/library/6tf1f0bc.aspx

引用:

このメソッドは、QuickSort アルゴリズムを使用します。この実装では不安定な並べ替えを実行します。つまり、2 つの要素が等しかった場合、これらの順序は保持されない可能性があります。一方、安定した並べ替えでは、等しい要素の順序が保持されます。

平均して、このメソッドは O(n log n) 操作です。ここで、n は array の Length です。最悪の場合は O(n ^ 2) 操作です。


だそうです。

スキルアップ/キャリアアップ(JOB@IT)