python - 对 x 轴的值进行排序,以便在计算 f(x) 时均匀地填充绘图 f(x)

标签 python algorithm sorting level-of-detail

用于一般理解的全局任务:我需要绘制函数 f(x) 的结果。任务很简单,但有两个问题:

  1. 对于 x 的每个值,f(x) 需要花费大量时间来计算(数十分钟甚至大约一个小时)。
  2. 我不知道 f(x) 的估计形状,因此我不知道在预定义的 x 限制中需要多少个 x 值才能正确表示该函数。

每次获得新的 f(x) 值时,我想更新 f(x) 的绘图。我不想因此求解 f(x),我想增加细节级别,所以每次我查看绘图时,我都会在我的所有 (x_min, x_max) 范围内看到它,并在此范围内缓慢更新范围。

因此问题是:我需要一个函数,它以正确的顺序提供 x 的列表。

受二分搜索的启发,我想出了以下算法:

list ax 个值仅包含唯一值,并且已排序。

def dissort(a)
    step = len(a) - 1
    picked = [False for x in a]
    out = []
    while False in picked and step > 0:
        for k in range(0, len(a), step):
            if not picked[k]:
                out.append(a[k])
                picked[k] = True
        step = step // 2
    return out

in = [1, 2, 3, 4, 5, 6, 7, 8, 9]
out = [1, 9, 5, 3, 7, 2, 4, 6, 8]
assert(dissort(in) == out)

我在这里看到了一些缺陷:picked数组可能是不必要的,并且每次细节级别增加时都会不必要地检查选取的值。目前我对它的性能很满意,但将来我可以将它用于更大的列表。

有没有办法提高性能?某些 python 包中已经有实现了吗?我没找到。

最佳答案

如果您的输入大小是 2 的幂,您可以获得与算法相同的顺序,如下所示:

要知道将第 n 个值放置在输出数组中的位置,请将 n 的二进制表示形式颠倒位顺序并将其用作输出数组中的索引:

示例

n  | bin   |   rev | out-index 
 
0  = 000   ->  000 = 0
1  = 001   ->  100 = 4
2  = 010   ->  010 = 2
3  = 011   ->  110 = 6
4  = 100   ->  001 = 1
5  = 101   ->  101 = 5
6  = 110   ->  011 = 3
7  = 111   ->  111 = 7

So IN: [A,B,C,D,E,F,G,H] -> OUT: [A,E,C,G,B,F,D,H]

需要O(n)时间

如何反转位的顺序请参阅 Reverse bits in number

优化方式:https://stackoverflow.com/a/746203/1921273

关于python - 对 x 轴的值进行排序,以便在计算 f(x) 时均匀地填充绘图 f(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66601478/

相关文章:

Python-Pandas : How to sort a pivot table maintaining one column grouped

Python Pandas Dataframe 替换低于阈值的值

python - 检查变量是否不是 None 并且是包含特定键的字典

algorithm - 使用归并排序计算反转次数

arrays - 是否有可能在不到 O(n) 的时间内从排序列表中删除重复项?

c# - 如何按不同的值对字符串进行排序

python - 一个模型 sqlalchemy 中的两个外键重复

.net - c#中的System.Security.Cryptography.RNGCryptoServiceProvider类中使用的算法是什么

algorithm - 为什么比较是任何合理实现中的主要成本?

c++ - 如何在 C++ 中对有理数数组进行排序?