Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/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
Algorithm 基于数字基系统的算法?_Algorithm_Math_Data Structures_Numbers_Number Systems - Fatal编程技术网

Algorithm 基于数字基系统的算法?

Algorithm 基于数字基系统的算法?,algorithm,math,data-structures,numbers,number-systems,Algorithm,Math,Data Structures,Numbers,Number Systems,我最近注意到,有很多算法部分或全部都是基于数字在创造性基础上的巧妙运用。例如: 二项式堆基于二进制数,而更复杂的倾斜二项式堆基于倾斜二进制数 一些生成字典序排列的算法是基于factoradic数制的 可以将尝试视为一次查看字符串的一个数字以获得适当基数的树 哈夫曼编码树的设计目的是让树中的每条边在某种二进制表示中编码一个零或一 斐波那契编码用于斐波那契搜索和反转某些类型的对数 我的问题是:还有哪些算法将聪明的数字系统作为其直觉或证明的关键步骤?。我正在考虑就这个问题进行一次演讲,所以我要从中

我最近注意到,有很多算法部分或全部都是基于数字在创造性基础上的巧妙运用。例如:

  • 二项式堆基于二进制数,而更复杂的倾斜二项式堆基于倾斜二进制数
  • 一些生成字典序排列的算法是基于factoradic数制的
  • 可以将尝试视为一次查看字符串的一个数字以获得适当基数的树
  • 哈夫曼编码树的设计目的是让树中的每条边在某种二进制表示中编码一个零或一
  • 斐波那契编码用于斐波那契搜索和反转某些类型的对数
我的问题是:还有哪些算法将聪明的数字系统作为其直觉或证明的关键步骤?。我正在考虑就这个问题进行一次演讲,所以我要从中吸取的例子越多越好

“三元数可以用来表示 自相似结构 Sierpinski三角形或Cantor集 方便地。”

“四元数用于 二维希尔伯特曲线的表示。”

四元虚数系统 由唐纳德·克努特于年首次提出 1955年,在一所高中的投稿中 科学人才搜索。这是一个 非标准位置数字系统 它使用虚数2i作为 它的基础。它能够代表 每个复数只使用 数字0、1、2和3。“

“罗马数字是一种双五进制系统。”

“Senary在未来可能会被认为是有用的 关于素数的研究 素数,当用六进制表示时, 除2和3之外,1或5作为 最后一位。”

“Sexagesimal(以60为基数)是一个数字 以六十为基数的系统 起源于古代苏美尔人 在公元前三千年,它是 传世 巴比伦人,它仍然被使用-在 修改后的表格-用于测量时间, 角度和地理坐标 这些都是角度。”

等等


是一个很好的起点。

RadixSort可以使用不同的基数。
bucketSort非常有趣的实现。

密码学广泛使用整数环(模算术)和有限域,它的操作直观地基于整系数多项式的行为方式。

我非常喜欢这个将二进制数转换为格雷码的方法:

不完全是一个聪明的基本系统,而是对基本系统的巧妙使用:序列是通过反转数字的base-n表示形式形成的。它们被用来构造看起来有点像的二维数字。

关于使用三元数字来解决“假币”问题(在这种情况下,你必须在一袋普通硬币中检测出一枚假币,并尽可能少地使用天平)

克里斯·冈崎骏(Chris Okasaki)在他的《纯函数数据结构》(Pure Functional Data Structures)一书中有一个非常好的章节,讨论了“数字表示”:本质上,将数字的一些表示形式转换为数据结构。为了给人一种感觉,以下是该章的部分:

  • 位置数制
  • 二进制数(二进制随机访问列表、无零表示、惰性表示、分段表示)
  • 扭曲二进制数(扭曲二进制随机访问列表、扭曲二项式堆)
  • 三元数和四元数
  • 一些最好的技巧,经过提炼:

    • 区分数字的密集表示和稀疏表示(通常在矩阵或图形中可以看到这一点,但它也适用于数字!)
    • 冗余数字系统(具有多个数字表示形式的系统)非常有用
    • 如果您将第一个数字安排为非零或使用无零表示,则检索数据结构的头部会非常有效
    • 通过分割数据结构,避免级联借用(从列表的尾部)和携带(从列表上考虑)
    以下是该章的参考列表:

    • Guibas、McCreight、Plass和Roberts:线性列表的新表示法
    • Myers:一种实用的随机访问栈
    • Carlsson,Munro,Poblette:一个具有恒定插入时间的隐式二项式队列
    • Kaplan,Tarjan:通过递归减速实现链接的纯函数列表

      • 好问题。名单确实很长。 告诉时间是一个简单的混合基数实例(天|小时|分钟|秒|上午/下午)


        如果您有兴趣了解的话,我已经创建了一个meta base枚举n元组框架。对于基本编号系统来说,这是一种非常甜蜜的语法糖。它还没有发布。给我的用户名发电子邮件(在gmail上)。

        我模模糊糊地记得一些关于双基系统的事情,它们可以加速矩阵乘法

        双基系统是一种冗余系统,一个数字使用两个基

         n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
        
        冗余意味着可以通过多种方式指定一个数字

        您可以查找Vassil Dimitrov、Todor Cooklev的文章“计算矩阵多项式的混合算法”

        尽我所能给出最好的简短概述

        他们试图计算矩阵多项式
        G(N,A)=I+A+…+A ^{N-1}

        假设N是复合的
        G(N,A)=G(J,A)*G(K,A^J)
        ,如果我们申请J=2,我们得到:

                 / (I + A) * G(K, A^2)        , if N = 2K
        G(N,A) = |
                 \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1
        
        而且

        “很明显”(开玩笑地)这些方程中的一些在第一个系统中很快,而在第二个系统中更好——因此,根据
        N
        从中选择最好的是一个好主意。但这需要对2和3进行快速模运算。这就是为什么双基出现的原因-你基本上可以快速地对它们进行模运算,给你一个com
                 / (I + A + A^2) * G(K, A^3)           , if N = 3K
        G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
                 \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2
        
                 / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
        G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
                 | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
                 \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6
        
        'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0
        
        65*256^3+66*256^2+67*256^1+68*256^0