Java “线性”;平滑的;使用查找表的函数
如果我想编写一个函数(可能也是一个类),它从不可变的查找表(调用构造函数时固定)返回线性“平滑”数据,如下所示: 例如Java “线性”;平滑的;使用查找表的函数,java,data-structures,Java,Data Structures,如果我想编写一个函数(可能也是一个类),它从不可变的查找表(调用构造函数时固定)返回线性“平滑”数据,如下所示: 例如func(5.0)==0.5 存储查找表的最佳方式是什么 我正在考虑使用两个数组 还有其他更好的方法吗? 计算所需值的最佳方法是什么?(就实时效率而言,不包括准备时间) 我正在考虑对arg上的查找表进行预排序,并使用二进制搜索查找最近的两点 或者我应该建立一个二叉树来简化搜索 或者还有其他更好的方法吗? (小调)这种函数/类/数据结构/算法叫什么?这在计算机科学中
func(5.0)==0.5
- 我正在考虑使用两个数组
- 还有其他更好的方法吗?
- 我正在考虑对
上的查找表进行预排序,并使用二进制搜索查找最近的两点arg
- 或者我应该建立一个二叉树来简化搜索
- 或者还有其他更好的方法吗?
我想我可能需要写我自己的课。该类充其量应该是不可变的,因为初始化后不需要更改它,而且可能会有多个线程使用它。我可能还需要通过索引获取键和值。看起来您正在尝试对一组点进行线性插值。我会使用
java.util.NavigableMap
。它提供了诸如higherEntry(K键)
和lowerEntry(K键)
等功能,有助于获取相邻点
你把你的(x,y)
s放入地图。当查询f(x_i)
时,首先检查映射是否包含在映射中,如果包含,则返回它。如果没有,您可以调用higherKey(x_i)
和lowerKey(x_i)
查找相邻的两点。然后使用公式对这两点进行插值(请参见
)
我还将在不同的类中实现插值逻辑,并将其作为构造函数参数传递给
函数
类,以防以后要使用不同的插值方法(即多项式插值)。所以它将搜索三次?我不确定NavigableMap
的实现,但如果我实现自己的,并使用一个二进制搜索,我可以在一次迭代中捕获两点或专用值。可能快三倍。。。无论如何,+1表示“不同类中的插值逻辑”。是的,我认为TreeMap
,如果调用higherEntry
和lowerEntry
,将搜索两次,但总体运行时间仍然是2log n=O(log n)
。我想这里的问题是,您是想花时间实现自己的数据结构和(修改过的)二进制搜索,还是使用现有的实现,只需付出一点代价。只是好奇,你的数据集有多大?它真的值得开发时间吗?对数运行时的伸缩性相当好。数据集最多为300个点。在大多数情况下,使用现有的实现是一个好主意,但我认为我可能需要某种类型的getKeyAt
和getValueAt
。我还希望该类是不可变的。创建一个不可变的类(即InterpolatedFunction
),并在内部使用NavigableMap
来管理点。确保映射不会泄漏到编写类中。现在,任何使用InterpolatedFunction
的客户端都将以只读方式访问数据集。func()
的参数精度是多少?可以考虑存储预先计算的值。@ XiaoJia双精度?认真地说,我认为在某些情况下,预先计算该值是可行的,我可以将输入四舍五入为整数值。我可以做另一个实现,但与此不同。我仍然需要另一个实时计算值的实现。