楼主: kaifengedu
5645 4

[问答] 能否一起探讨下R中对两有序数组进行合并成一个有序数组的问题? [推广有奖]

  • 0关注
  • 18粉丝

已卖:641份资源

学科带头人

4%

还不是VIP/贵宾

-

威望
0
论坛币
1674 个
通用积分
475.3180
学术水平
85 点
热心指数
128 点
信用等级
60 点
经验
32847 点
帖子
913
精华
0
在线时间
1637 小时
注册时间
2010-2-2
最后登录
2025-12-15

楼主
kaifengedu 发表于 2014-2-5 18:41:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
看一本R语言的书,其中有一个问题如下:
Write a program to merge two sorted vectors into a single sorted vector.
Do not use the sort(x) function, and try to make your program as efficient
as possible. That is, try to minimise the number of operations required to
merge the vectors.
能否一起探讨一下有效的算法,我先抛砖引玉,思想来自网络的帖子:
  1. a <- -10:10
  2. b <- 2:8
  3. checkSort <- function(x) {
  4. result = TRUE
  5. for (i in 1:(length(x) - 1)) {
  6. for (j in (i + 1):length(x)) {
  7. if (x[j - 1] > x[j]){
  8. result <- FALSE
  9. break
  10. }
  11. }
  12. }
  13. return(result)
  14. }

  15. mergesort <- function(a, b) {
  16. if (checkSort(a) & checkSort(b)){
  17. a.length <- length(a)
  18. b.length <- length(b)
  19. n <- a.length + b.length
  20. result.vec <- rep(0, n)
  21. i <- 1
  22. j <- 1
  23. k <- 1
  24. while(i <= a.length & j <= b.length){
  25. if(a[i] <= b[j]) {
  26. result.vec[k] <- a[i]
  27. i <- i +1
  28. k <- k + 1
  29. } else {
  30. result.vec[k] <- b[j]
  31. j <- j + 1
  32. k <- k + 1
  33. }
  34. }
  35. while(i <= a.length) {
  36. result.vec[k] <- a[i]
  37. i <- i +1
  38. k <- k + 1
  39. }
  40. while(j <= b.length) {
  41. result.vec[k] <- b[j]
  42. j <- j + 1
  43. k <- k + 1
  44. }
  45. return(result.vec)
  46. } else {
  47. cat("please input two sorted vectors")
  48. }

  49. }
  50. mergesort(a, b)
复制代码



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:一起探讨 行合并 Operations EFFICIENT operation function possible required number single

沙发
ntsean 发表于 2014-2-6 02:05:55
mergesort算法,这个就是
已有 1 人评分学术水平 热心指数 收起 理由
kaifengedu + 1 + 1 鼓励积极发帖讨论

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
nuomin 发表于 2014-2-6 08:37:35
想写一个看起来像R的排序方法,可是问题也来了。当从数组中删除最后一个元素时,R将个这个数组赋值为长度为1,值为0的数组。这个怎么处理比较好?下面是我写的代码
  1. #########################
  2. ## R style merger sort ##
  3. #########################

  4. m_sort <- function(iter_list){
  5.     stopifnot(iter_list$len>0)
  6.     xx <- iter_list$x;yy <- iter_list$y;kk <-iter_list$k
  7.     print(paste("xx=",length(xx),sep=""),env=.GlobalEnv)
  8.     print(paste("yy=",length(yy),sep=""),env=.GlobalEnv)
  9.     indeks <- NA
  10.     if(min(xx)<=min(yy) && length(xx)>0){
  11.         vec_in_globe[kk+1] <<- min(xx)
  12.         indeks <- which.min(xx)
  13.         iter_list$x <- xx[-indeks]
  14.     }
  15.     if(min(yy)<min(xx) && length(yy)>0){
  16.         vec_in_globe[kk+1] <<- min(yy)
  17.         indeks <- which.min(yy)
  18.         iter_list$y <- yy[-indeks]
  19.     }
  20.     iter_list$k <- kk+1
  21.     iter_list$len <- iter_list$len-1
  22.     m_sort(iter_list)
  23. }

  24. a <- 1:10;b <- 2:8;k <- 1;len <- length(a)+length(b)
  25. vec_in_globe <- numeric(len)
  26. iter_list <- list(x=a[!is.na(a)],y=b[!is.na(b)],k=k,len=len)
  27. m_sort(iter_list)
复制代码
输出的结果如下:
  1. > a <- 1:10;b <- 2:8;k <- 1;len <- length(a)+length(b)
  2. > vec_in_globe <- numeric(len)
  3. > iter_list <- list(x=a[!is.na(a)],y=b[!is.na(b)],k=k,len=len)
  4. > m_sort(iter_list)
  5. [1] "xx=10"
  6. [1] "yy=7"
  7. [1] "xx=9"
  8. [1] "yy=7"
  9. [1] "xx=8"
  10. [1] "yy=7"
  11. [1] "xx=8"
  12. [1] "yy=6"
  13. [1] "xx=7"
  14. [1] "yy=6"
  15. [1] "xx=7"
  16. [1] "yy=5"
  17. [1] "xx=6"
  18. [1] "yy=5"
  19. [1] "xx=6"
  20. [1] "yy=4"
  21. [1] "xx=5"
  22. [1] "yy=4"
  23. [1] "xx=5"
  24. [1] "yy=3"
  25. [1] "xx=4"
  26. [1] "yy=3"
  27. [1] "xx=4"
  28. [1] "yy=2"
  29. [1] "xx=3"
  30. [1] "yy=2"
  31. [1] "xx=3"
  32. [1] "yy=1"
  33. [1] "xx=2"
  34. [1] "yy=1"
  35. [1] "xx=2"
  36. [1] "yy=0"
  37. [1] "xx=1"
  38. [1] "yy=0"
  39. Error: iter_list$len > 0 is not TRUE
  40. In addition: Warning messages:
  41. 1: In min(yy) : no non-missing arguments to min; returning Inf
  42. 2: In min(yy) : no non-missing arguments to min; returning Inf
  43. 3: In min(yy) : no non-missing arguments to min; returning Inf
  44. 4: In min(yy) : no non-missing arguments to min; returning Inf
  45. > vec_in_globe
  46. [1]  0  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9 10
复制代码
期望的输出是
  1. [1]  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9 10
复制代码
这是对空数组赋值0造成的
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
kaifengedu + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
kaifengedu 发表于 2014-2-6 11:14:42
nuomin 发表于 2014-2-6 08:37
想写一个看起来像R的排序方法,可是问题也来了。当从数组中删除最后一个元素时,R将个这个数组赋值为长度为 ...
您好,您在程序里面令k<-0就会出现正确结果,另外看到您程序里有一些警告,可以修改如下就不出现警告了。
  1. #########################
  2. ## R style merger sort ##
  3. #########################

  4. m_sort <- function(iter_list){
  5.   stopifnot(iter_list$len>0)
  6.   xx <- iter_list$x;yy <- iter_list$y;kk <-iter_list$k
  7.   indeks <- NA
  8.   if (length(xx)>0 && length(yy)>0){
  9.     if(min(xx)<=min(yy)){
  10.       print(paste("xx=",length(xx),sep=""),env=.GlobalEnv)
  11.       vec_in_globe[kk+1] <<- min(xx)
  12.       indeks <- which.min(xx)
  13.       iter_list$x <- xx[-indeks]
  14.     }
  15.     if(min(yy)<min(xx)){
  16.       print(paste("yy=",length(yy),sep=""),env=.GlobalEnv)
  17.       vec_in_globe[kk+1] <<- min(yy)
  18.       indeks <- which.min(yy)
  19.       iter_list$y <- yy[-indeks]
  20.     }
  21.    
  22.   }else if(length(xx)>0) {
  23.     print(paste("xx=",length(xx),sep=""),env=.GlobalEnv)
  24.     vec_in_globe[kk+1] <<- min(xx)
  25.     indeks <- which.min(xx)
  26.     iter_list$x <- xx[-indeks]
  27.   } else if (length(yy)>0) {
  28.     print(paste("yy=",length(yy),sep=""),env=.GlobalEnv)
  29.     vec_in_globe[kk+1] <<- min(yy)
  30.     indeks <- which.min(yy)
  31.     iter_list$y <- yy[-indeks]
  32.   }
  33.   
  34.   iter_list$k <- kk+1
  35.   iter_list$len <- iter_list$len-1
  36.   m_sort(iter_list)
  37. }

  38. a <- 1:10;
  39. b <- 2:8;
  40. k <- 0;
  41. len <- length(a)+length(b)
  42. vec_in_globe <- numeric(len)
  43. iter_list <- list(x=a[!is.na(a)],y=b[!is.na(b)],k=k,len=len)
  44. m_sort(iter_list)
  45. vec_in_globe
复制代码
结果是:

  1. > m_sort(iter_list)
  2. [1] "xx=10"
  3. [1] "xx=9"
  4. [1] "yy=7"
  5. [1] "xx=8"
  6. [1] "yy=6"
  7. [1] "xx=7"
  8. [1] "yy=5"
  9. [1] "xx=6"
  10. [1] "yy=4"
  11. [1] "xx=5"
  12. [1] "yy=3"
  13. [1] "xx=4"
  14. [1] "yy=2"
  15. [1] "xx=3"
  16. [1] "yy=1"
  17. [1] "xx=2"
  18. [1] "xx=1"
  19. Error: iter_list$len > 0 is not TRUE
  20. > vec_in_globe
  21. [1] 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 10
复制代码

另外想请问一下,您的这行命令里

  1. print(paste("yy=",length(yy),sep=""),env=.GlobalEnv)
复制代码
env=.GlobalEnv有什么样的作用,谢谢!

报纸
nuomin 发表于 2014-2-6 16:44:26
kaifengedu 发表于 2014-2-6 11:14
您好,您在程序里面令k
在最顶端的环境输出

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 16:27