Arrays 如何创建可排序的长嵌套列表?
说明: 我想创建一个列表,理想情况下是无限制的,但我可以使用至少1000个初始项目,其中每个初始列表项目之间可以创建无限数量的列表,每个后续创建的项目之间也可以创建无限数量的列表 想法1: 列表以1项开始,我们称之为Arrays 如何创建可排序的长嵌套列表?,arrays,math,numbers,Arrays,Math,Numbers,说明: 我想创建一个列表,理想情况下是无限制的,但我可以使用至少1000个初始项目,其中每个初始列表项目之间可以创建无限数量的列表,每个后续创建的项目之间也可以创建无限数量的列表 想法1: 列表以1项开始,我们称之为x。 然后,我可以在x的左侧或右侧添加1个项目,如果左侧需要更小,右侧需要更大。 一种尝试是使用整数,因此如果x是500,我们现在有[499500501],我们继续[498499500501502]。 现在,我需要在项目之间添加一个项目,例如,在500和501之间,所以让我们使用小数
x
。
然后,我可以在x
的左侧或右侧添加1个项目,如果左侧需要更小,右侧需要更大。
一种尝试是使用整数,因此如果x
是500
,我们现在有[499500501]
,我们继续[498499500501502]
。
现在,我需要在项目之间添加一个项目,例如,在500
和501
之间,所以让我们使用小数并添加500.5
,然后在500.5
和501
之间添加一个项目,这样将是500.75
,依此类推
问题:
这个方法将只运行38次,直到我们达到500.99999999999
之后,我运行的任何程序,无论是编程语言(JavaScript)还是Excel,都将停止添加小数点位置
此外,我应该能够在500.5
和500.75
之间创建一个列表,在37次迭代后,该列表将停止在500.749999999
,以此类推
想法2:
使用字母。然后可以按字母顺序对结果进行排序。从L
开始,左边我们添加K
,右边我们添加M
:[K,L,M]
。
在L
和M
之间,我们可以创建LM
,然后在LM
和M
之间,我们可以添加LMM
等等
问题:
这种方法的局限性在于,在左边我们只能进入A
,在右边我们只能到达Z
,远低于所需的1000项
有人有什么建议吗?也许是字母和数字的组合?(但如何分类呢?)或者是一些我不知道的公式?谢谢。我可以想出多种解决方案。哪种方法最有效取决于您的编程语言 首先,您可以继续使用浮点数的概念,但使用扩展精度包或具有扩展精度浮点数的语言。在Python中,可以使用标准的
decimal
模块。在开始之前,可以将数字的精度设置得足够高,以覆盖可能添加的数字数量。对于1000个加法,使用302个小数位就足够了。某些语言或软件包具有无限精度,您无需事先设置精度
其次,你可以使用有理数。Python有分数模块,由于Python的整数是任意精度的,所以分数也是任意精度的
第三,您可以通过使用2个正整数元组来实现自己的分数类型。元组(a,b)
“表示”正有理数a/b
,但这些“有理数”是您自己实现的。您可以从(1,1)
开始。那么(a,b)
小于(c,d)
当且仅当a*d
。使用(a,b+1)
使元组(a,b)
变小,使用(a+1,b)
使元组变大。通过(a+c,b+d)
可以得到一个介于(a,b)
和(c,d)
之间的元组。如果整数的精度为任意精度,则此方法效果最佳
第四,可以使用2元组,第一个元素为整数,第二个元素为字符串。(0,'A')
之前的元组是(-1,'A')
,而(0,'Z')
之后的元组是(0,'ZA')
,或者您可以使用(1,'Z')
。如您所知,介于(0,'A')
和(0,'B')
之间的元组是(0,'AB')
第五,可以模拟二叉搜索树(BST)。由于您需要的是列表而不是实际的BST,因此可以通过使列表中的每个项目表示BST中的一个节点来模拟列表,其中'L'
表示左子,而'R'
表示右子。列表以单个项'
开始,该项为空字符串,表示BST的根。若要在最左侧项的左侧获取项,请将'L'
连接到字符串的末尾以获取所需项。要在最右边的项目右侧获取项目,请将'R'
连接到字符串末尾。要在两个相邻项目之间获得一个项目,我们意识到其中一个项目必须是另一个项目的初始部分。如果左侧项目比右侧项目长,请将'R'
连接到左侧项目。如果左侧项目比右侧项目短,请将'L'
连接到右侧项目。请注意,此方法同构于使用从1
开始的分数,添加'L'
同构于减去1/2
的幂,添加'R
同构于添加1/2
的幂。但是字符串避免了有限精度问题
我也能想到其他的可能性。如果我要实现您的想法,我会使用Python中的分数,因为它们很好地集成到语言中。然后,排序、打印等都已经用这种语言处理了。谢谢@Rory,如果我存储分数,不管它看起来像a/b
还是(a,b)
,那么我该如何将它们升序排列?@trs:如果使用Python,那么分数模块中的分数将被视为正则数。要对列表进行排序,只需使用sort
方法或sorted
函数,无需特殊处理。打印分数或在其上执行str
操作会导致类似a/b
的结果。对其执行repr
会导致类似F的结果