首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能给出基类的单半群或半群吗?

你能给出基类的单半群或半群吗?
EN

Stack Overflow用户
提问于 2014-02-21 11:52:32
回答 2查看 790关注 0票数 8

这是基排序的伪码:

代码语言:javascript
复制
Pseudocode for Radix Sort:
Radix-Sort(A, d)
// Each key in A[1..n] is a d-digit integer. (Digits are
// numbered 1 to d from right to left.)
1. for i = 1 to d do
Use a stable sorting algorithm to sort A on digit i.

这是基排序的Scala代码:

代码语言:javascript
复制
object RadixSort {
  val WARP_SIZE = 32

  def main(args: Array[String]) = {
    var A = Array(123,432,654,3123,654,2123,543,131,653,123)

    radixSortUintHost(A, 4).foreach(i => println(i))
  }

  // LSB radix sort
  def radixSortUintHost(A: Array[Int], bits: Int): Array[Int] = {
    var a = A
    var b = new Array[Int](a.length)

    var rshift = 0
    var mask = ~(-1 << bits)

    while (mask != 0) {
      val cntArray = new Array[Int](1 << bits)

      for (p <- 0 until a.length) {
        var key = (a(p) & mask) >> rshift
        cntArray(key)+= 1
      }

      for (i <- 1 until cntArray.length)
        cntArray(i) += cntArray(i-1)

      for (p <- a.length-1 to 0 by -1) {
        var key = (a(p) & mask) >> rshift
        cntArray(key)-= 1
        b(cntArray(key)) = a(p)
      }

      val temp = b
      b = a
      a = temp

      mask <<= bits
      rshift += bits
    }

    b
  }
}

这是基排序的Haskell代码:

代码语言:javascript
复制
import Data.Bits (Bits(testBit, bitSize))
import Data.List (partition)

lsdSort :: (Ord a, Bits a) => [a] -> [a]
lsdSort = fixSort positiveLsdSort

msdSort :: (Ord a, Bits a) => [a] -> [a]
msdSort = fixSort positiveMsdSort

-- Fix a sort that puts negative numbers at the end, like positiveLsdSort and positiveMsdSort
fixSort sorter list = uncurry (flip (++)) (break (< 0) (sorter list))

positiveLsdSort :: (Bits a) => [a] -> [a]
positiveLsdSort list = foldl step list [0..bitSize (head list)] where
step list bit = uncurry (++) (partition (not . flip testBit bit) list)

positiveMsdSort :: (Bits a) => [a] -> [a]
positiveMsdSort list = aux (bitSize (head list) - 1) list where
aux _ [] = []
aux (-1) list = list
aux bit list = aux (bit - 1) lower ++ aux (bit - 1) upper where
    (lower, upper) = partition (not . flip testBit bit) list

我的问题是:,你能给出基排序的单半群或半群吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-22 06:58:02

基排序不变量是使用第一个k位对数据进行排序。如果您想要一个添加更多数据排序或未排序的操作,则需要合并排序功能,而不是基。如果您要向所有记录中添加一些数据,则可以使用一个单子。

编辑:单半群的hart是一种结合运算。我们可以把排序位看作是应用偏序的一种方式。你一点一点地伤害了所有记录的数据。每个位都应用了一个部分顺序。这是关联的,您可以合并一些位以获得更详细的部分顺序。注顺序很重要,但它仍然是associative.and,因此可以将be.viewed作为一个单子

票数 0
EN

Stack Overflow用户

发布于 2015-05-22 21:55:36

我想你可能太在意基数排序的概念了。抽象地说,我想你想要的单半群是

  1. 排序列表
  2. 合并

最大的问题是如何表示排序的列表。如果将它们表示为已排序的Haskell列表,则合并操作是合并排序中常用的逐段合并操作。如果你用一种更“弧形”的方式来表示它们,那么你就会有各种各样的trie。您可能会找到一些合并尝试的算法。在bytestring-trie中有一个,但是似乎没有任何关于它的实现的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21933737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档