表的应用——排序与描述多项式

排序

朴素排序

在链表建立的过程中可以直接完成排序功能,即建立一个新链表并将源数据一个一个存进新链表中,每个元素存储的位置在小于这个元素的节点和大于这个元素的节点之间

排序部分

func (s *sort_table) append(data int) {
    node := s.head
    for (node.next != nil) && (node.next.data.data <= data) {
        node = node.next
    }
    new_data := table_data{data}
    new_node := &table_node{new_data, node.next}
    node.next = new_node
    s.length++
}

判断要插入的值是否刚比下一个值小,若小则插入这一个节点与下一个节点之间。若无比要插入值大的节点则将待插入值插入链表的最后

遍历部分

func (s *sort_table) return_result() []int {
    result := []int{}
    node := s.head.next
    for node != nil {
        result = append(result, node.data.data)
        node = node.next
    }
    return result
}

从头开始顺序遍历,直到所有值被取出

基数排序

这是一种类似于桶排序的排序方法,以基10排序为例,首先建立10个桶,分别是0~9,按十进制数的最低位送进对应的桶中,再按桶顺序取出,依次再按次低位送进桶中,重复到最高位,再依次取出则得到排序结果(顺序均是从0桶到9桶,同一个桶先进先出)

桶ADT

type card_sort struct {
    link_table
}

func (c *card_sort) pop() int {
    if c.head.next == nil {
        return -1
    } else {
        data := c.head.next.data.data
        c.head.next = c.head.next.next
        return data
    }
}

“继承”链表的方法,添加从头取出节点的方法pop()

初始化桶函数

func initial_bucket() [10]*card_sort {
    bucket := [10]*card_sort{}
    new_data := link_table{table_node{table_data{}, nil}, 0}
    for i := 0; i < len(bucket); i++ {
        bucket[i] = &card_sort{new_data}
    }
    return bucket
}

初始化一个尺寸为10的桶数组

获得基数函数

func get_num(num int, data int) int {
    return int(float64(data)/math.Pow(10, float64(num))) % 10
}

获取传入参数data的第num(从0开始计数)位数

入桶函数

func in_bucket(data []int, num int) [10]*card_sort {
    bucket := initial_bucket()
    for i := range data {
        bucket[get_num(num, data[i])].append(table_data{data[i]})
    }
    return bucket
}

按顺序将切片带入的数据根据获得的基数送入对应的桶中

出桶函数

func out_bucket(bucket [10]*card_sort) []int {
    temp := 0
    data := []int{}
    for i := range bucket {
        temp = bucket[i].pop()
        for temp != -1 {
            data = append(data, temp)
            temp = bucket[i].pop()
        }
    }
    // fmt.Println(data)
    return data
}

从桶0开始依次将桶中的数据取出放入一个切片中

一次桶排序函数

func card_sort_step(bucket [10]*card_sort, num int) [10]*card_sort {
    data := out_bucket(bucket)
    return in_bucket(data, num)
}

先出桶,后按给定的位数num入桶

桶排序函数

func card_sort_eval(data []int, num int) []int {
    bucket := in_bucket(data, 0)
    for i := 1; i < num; i++ {
        bucket = card_sort_step(bucket, i)
    }
    return out_bucket(bucket)
}

多项式ADT

使用表的方式可以描数单元的多项式(如果使用链表,则数据部分就是{系数,幂次数})

多项式链表结构体

type Table_data struct {
    coefficient int
    index       int
}

type table_node struct {
    data Table_data
    next *table_node
}

type Mult struct {
    head   *table_node
    length int
}

多项式插入方法

func (s *Mult) Append(data Table_data) {
    node := s.head
    for (node.next != nil) && (node.next.data.index <= data.index) {
        node = node.next
    }
    if node.data.index == data.index {
        node.data.coefficient += data.coefficient
    } else {
        new_node := &table_node{data, node.next}
        node.next = new_node
        s.length++
    }
}

寻找到恰好大于待插入值的节点,for循环结束后,结果可能有两种:

  • 待插入值等于现节点,直接合并
  • 待插入值不等于现节点,插入新节点

结果显示方法

func (s *Mult) Return_result() []Table_data {
    result := []Table_data{}
    node := s.head.next
    for node != nil {
        result = append(result, node.data)
        node = node.next
    }
    return result
}

遍历多项式,打印系数与幂次

多项式相加

func (self *Mult) Add_(adder *Mult) {
    adder_node := adder.head.next
    for adder_node != nil {
        self.Append(adder_node.data)
        adder_node = adder_node.next
    }
}

将一个多项式的全部取出并插入另一个多项式即完成多项式相加

多项式相乘

func (self *Mult) Dot(mul *Mult) *Mult {
    mul_node, node := mul.head.next, self.head.next
    new_index, new_co := 0, 0
    new_table := New_mult()
    for node != nil {
        mul_node = mul.head.next
        for mul_node != nil {
            new_index = mul_node.data.index + node.data.index
            new_co = mul_node.data.coefficient * node.data.coefficient
            new_table.Append(Table_data{new_co, new_index})
            mul_node = mul_node.next
        }
        node = node.next
    }
    return new_table
}

将两个多项式的节点取出两两相乘(幂指数相加,系数相乘),将结果插入一个新多项式中完成多项式相加

GO语言笔记

同package多文件

当一个package由多个文件描述时,应当将所有文件放在同一目录下,运行时包括所有.go文件

自定义包

将包放在一个文件夹中,文件夹名与package名相同,调用时路径写到文件夹即可。另外包中的需要在包外被调用的函数/变量/常量/结构体等首字母要大写

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,098评论 0 12
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,261评论 0 16
  • 表格的学习 表格 table thead 表头 (可以忽略) tr 行 th 列 tbody 表体...
    Cyril丶阅读 177评论 0 0
  • 我一直自诩是个没文化的人,不看书不读报,算“文盲”,虽然我其实是个工科博士。但从小对诗词歌赋就不太感兴趣,让我一直...
    淼博士阅读 273评论 0 0
  • 在开发需求需要兼容IE8-IE10时,为了使盒模型计算更加方便大多都选择使用了box-sizing 在没有使用bo...
    niccky阅读 1,317评论 0 1