提问人:Meghashyam Chirravoori 提问时间:9/3/2020 最后编辑:Jonathan HallMeghashyam Chirravoori 更新时间:9/3/2020 访问量:179
将字符串与指向字符串的指针作为函数的参数传递给函数时,时间复杂度有什么区别?
What is the difference in time complexity when passing a string versus a pointer to the string as parameter to a function?
问:
假设我有一个字符串 s。
s := "helloworld"
现在,我的问题是,如果 s 有 'n' 个字节,如果我将 s 传递给函数,而不是将 &s 传递给函数,然后访问字符串的第 i 个字节,那么相对于 'n' 的时间复杂度是多少。
如果我将 &s 传递给函数并访问字符串的第 i 个字节需要 O(1) 时间,那么当我将 s 传递给函数然后访问字符串的第 i 个字节时需要 O(n) 时间(因为整个字符串将被复制)?
我试了一下,发现复制一个字符串确实会改变指向它的指针。希望对此更清楚。
func main() {
str := "helloworld"
fmt.Println("string pointer 1:", &str)
printStringPointer(str)
}
func printStringPointer(s string) {
fmt.Println("string pointer 2:", &s)
}
输出:
string pointer 1: 0xc000010200
string pointer 2: 0xc000010210
答:
5赞
Marc
9/3/2020
#1
go 中的字符串类似于切片,它们只是一个细描述符,包含指向基础数据的指针和长度。
您可以在反射中看到这一点。StringHeader 类型:
type StringHeader struct {
Data uintptr
Len int
}
将字符串传递给函数时,会复制标头,但不会复制基础数据。我们可以更改您的示例以打印 的值,显示它指向内存中的相同地址: playground 链接:Data
func main() {
str := "helloworld"
fmt.Println("string pointer 1: ", &str)
fmt.Println("string Data 1: ", (*reflect.StringHeader)(unsafe.Pointer(&str)).Data)
printStringPointer(str)
}
func printStringPointer(s string) {
fmt.Println("string pointer 2: ", &s)
fmt.Println("string Data 2: ", (*reflect.StringHeader)(unsafe.Pointer(&s)).Data)
}
输出:
string pointer 1: 0xc000010200
string Data 1: 4970654
string pointer 2: 0xc000010210
string Data 2: 4970654
传递字符串是恒定时间(复制标头),不复制基础数据。
评论
*string