BaezaYates 交集python和golang代码
def bsearch(find, arr, low, high):
while low <= high:
mid = (low + high) >> 1
if arr[mid] == find:
return mid, True
elif arr[mid] > find:
high = mid - 1
else:
low = mid + 1
return low, False def BaezaYates_intersect_helper(A, B, left1, right1, left2, right2, result):
if left1 > right1 or left2 > right2:
return
if right1-left1 > right2-left2:
left1, left2 = left2, left1
right1, right2 = right2, right1
A, B = B, A
mid = (left1 + right1) >> 1
index,found = bsearch(A[mid], B, left2, right2)
if found:
result.append(A[mid])
BaezaYates_intersect_helper(A, B, left1, mid-1, left2, index-1, result)
BaezaYates_intersect_helper(A, B, mid+1, right1, index+1, right2, result)
else:
if A[mid] > B[right2]:
BaezaYates_intersect_helper(A, B, left1, mid-1, left2, right2, result)
elif A[mid] < B[left2]:
BaezaYates_intersect_helper(A, B, mid+1, right1, left2, right2, result)
else:
BaezaYates_intersect_helper(A, B, left1, mid-1, left2, index-1, result)
BaezaYates_intersect_helper(A, B, mid+1, right1, index, right2, result) def BaezaYates_intersect(A, B):
result = []
BaezaYates_intersect_helper(A, B, 0, len(A)-1, 0, len(B)-1, result)
result.sort()
return result from random import randint if __name__ == "__main__":
for i in range(2000):
A = [randint(0, 100) for i in range(30)]
B = [randint(0, 100) for i in range(30)] A.sort()
B.sort() #print A
#print B inter_set = BaezaYates_intersect(A, B)
#print inter_set inter_set2 = set(A) & set(B) for data in inter_set:
assert data in inter_set2
print "tests passed..."
对应的go代码:
package main import (
"fmt"
"math/rand"
"sort"
"time"
) func bsearch(find int, arr []int, low int, high int) (int, bool) {
for low <= high {
mid := (low + high) >> 1
if arr[mid] == find {
return mid, true
} else if arr[mid] > find {
high = mid - 1
} else {
low = mid + 1
}
}
return low, false
} func BaezaYatesIntersectHelper(A []int, B []int, left1 int, right1 int, left2 int, right2 int, result *[]int) {
if left1 > right1 || left2 > right2 {
return
}
if right1-left1 > right2-left2 {
left1, left2 = left2, left1
right1, right2 = right2, right1
A, B = B, A
}
mid := (left1 + right1) >> 1
index, found := bsearch(A[mid], B, left2, right2)
/*
if found {
fmt.Printf("A[mid]=%d index=%d\n", A[mid], index)
}
*/
if found {
*result = append(*result, A[mid])
BaezaYatesIntersectHelper(A, B, left1, mid-1, left2, index-1, result)
BaezaYatesIntersectHelper(A, B, mid+1, right1, index+1, right2, result)
} else {
if A[mid] > B[right2] {
BaezaYatesIntersectHelper(A, B, left1, mid-1, left2, right2, result)
} else if A[mid] < B[left2] {
BaezaYatesIntersectHelper(A, B, mid+1, right1, left2, right2, result)
} else {
BaezaYatesIntersectHelper(A, B, left1, mid-1, left2, index-1, result)
BaezaYatesIntersectHelper(A, B, mid+1, right1, index, right2, result) }
}
} func BaezaYatesIntersect(A, B []int) []int {
result := []int{}
BaezaYatesIntersectHelper(A, B, 0, len(A)-1, 0, len(B)-1, &result)
sort.Ints(result)
return result
} func random(min, max int) int {
return rand.Intn(max-min) + min
} func main() {
const SIZE int = 30
for i := 0; i < 2000; i++ {
A, B := [SIZE]int{}, [SIZE]int{}
rand.Seed(time.Now().Unix())
for j := 0; j < 30; j++ {
A[j] = random(0, 100)
B[j] = random(0, 100)
} sort.Ints(A[:])
sort.Ints(B[:])
fmt.Println(A)
fmt.Println(B) inter_set := BaezaYatesIntersect(A[:], B[:])
fmt.Println(inter_set)
/*
inter_set2 = set(A) & set(B) for data in inter_set:
assert data in inter_set2
*/
}
fmt.Printf("tests passed...\n")
}
牢记go语言中:
(1)要修改函数输入的slice参数,必须通过指针才能搞定,比如
func BaezaYatesIntersectHelper(A []int, B []int, left1 int, right1 int, left2 int, right2 int, result *[]int)
最后一个参数!如果去掉指针,则无任何append效果!
(2)slice本质是array的内存引用!修改它必然会影响到array!因此,
sort.Ints(A[:]) 可以实现数组排序!
BaezaYates 交集python和golang代码的更多相关文章
- python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题
笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...
- vim python和golang开发环境配置
首先在-下新建目录.vim和配置文件.vimrc,.vimrc内容如下: syntax on set nocompatible filetype off set rtp+=~/.vim/bundle/ ...
- 深入浅出爬虫之道: Python、Golang与GraphQuery的对比
深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具 ...
- Python 坑爹之 代码缩进
建议:统一使用空格!!!!!!!!!不要Tab Python代码缩进 这两天python-cn邮件列表有一条thread发展的特别长,题目是<python的代码缩进真是坑爹>(地址), ...
- Python第一行代码
Python版本:Python 3.6.1 0x01 命令行交互 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计 ...
- python的PEP8 代码风格指南
PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...
- 用python处理html代码的转义与还原
用python处理html代码的转义与还原 转义 escape: import cgi s = cgi.escape("""& < >" ...
- 【转】利用Boost.Python将C++代码封装为Python模块
用Boost.Python将C++代码封装为Python模块 一. 基础篇 借助Boost.Python库可以将C/C++代码方便.快捷地移植到python模块当中,实现对python模块的扩 ...
- python爬虫小说代码,可用的
python爬虫小说代码,可用的,以笔趣阁为例子,python3.6以上,可用 作者的QQ:342290433,汉唐自远工程师 import requests import refrom lxml i ...
随机推荐
- Java设计模式之策略模式(Strategy Pattern)
简介 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 组成 1.抽象策略角色(Strategy): 策略类,通常由一个接口或者抽象类实现. 2.具 ...
- Wireshark does not show SSL/TLS
why it doesn't show as "TLS/SSL"? Because it's not on the standard port for SSL/TLS. You c ...
- Win7解决无法在资源管理器中连接FTP问题
需要连接FTP站点,但是又不想使用任何工具,使用电脑自带的资源管理器实现连接. 一般来说是能正常连接没有问题的,但是存在个别电脑不行. 试过好多办法不行,如下办法方法管用. 复制以下代码,本地保存为R ...
- 冒泡排序 and 选择排序 变量打印斐波拉契数列 and 数组打印斐波拉契数列
1 排序 1.1 冒泡排序 #include <stdio.h> int main() { ]; printf("input six int numbers:\n"); ...
- Springboot+dubbo+zookeeper整合
本想自己搭建一个Spring+dubbo+zookeeper整合好的框架,想寻找个最佳实现但是遇到各种各样的问题,只好自己看看dubbo starter的源码 整理如下: 通过打上断点来看配置的对不对 ...
- Swift - 修改导航栏“返回”按钮文字,图标
Swift - 修改导航栏“返回”按钮文字,图标 2015-11-27 09:13发布:hangge浏览:4037 项目中常常会使用 UINavigationController 对各个页面进行导 ...
- HDU 4945 (dp+组合数学)
2048 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- 2018/3/4 Activiti教程之对于流程的基本操作以及从发起到完成还有相关注意事项(与Springboot整合版)三
写教程实在太累了,,,还浪费时间,Activiti教程就写到这好了,不过最近在玩区块链,到时候写几个区块链方面的教程. 这是一些流程的查询与删除api,删除这块,默认是级联删除(加个false参数,就 ...
- 【Nginx】负载均衡-IP哈希策略剖析
转自:江南烟雨 IP哈希初始化 IP哈希的初始化函数ngx_http_upstream_init_ip_hash(ngx_http_upstream_ip_hash_module.c): static ...