Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何创建可排序的长嵌套列表?_Arrays_Math_Numbers - Fatal编程技术网

Arrays 如何创建可排序的长嵌套列表?

Arrays 如何创建可排序的长嵌套列表?,arrays,math,numbers,Arrays,Math,Numbers,说明: 我想创建一个列表,理想情况下是无限制的,但我可以使用至少1000个初始项目,其中每个初始列表项目之间可以创建无限数量的列表,每个后续创建的项目之间也可以创建无限数量的列表 想法1: 列表以1项开始,我们称之为x。 然后,我可以在x的左侧或右侧添加1个项目,如果左侧需要更小,右侧需要更大。 一种尝试是使用整数,因此如果x是500,我们现在有[499500501],我们继续[498499500501502]。 现在,我需要在项目之间添加一个项目,例如,在500和501之间,所以让我们使用小数

说明:

我想创建一个列表,理想情况下是无限制的,但我可以使用至少1000个初始项目,其中每个初始列表项目之间可以创建无限数量的列表,每个后续创建的项目之间也可以创建无限数量的列表

想法1:

列表以1项开始,我们称之为
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的结果