Задача F из Яндекс.Интервью
Как осуществить слияние k сортированных списков
Тут есть условие задачи но там суть вопроса другая, мне же важно понять почему происходит то что я описал ниже
Проблема в том что код не проходит даже первый тест, хотя у меня она проходит все тесты через модуль тестирования, я предполагаю что проблема в горгутинах
package main
import (
"bufio"
"io"
"os"
"strconv"
"strings"
)
func main(){
MainFunc("input.txt","output.txt")
}
func MainFunc(input string,output string){
file,_ := os.Open(input)
r := bufio.NewReader(file)
chanStr := make(chan []int,64)
chanLines := make(chan int)
finish := make(chan []int)
var lines = -1
go mergeArray(chanLines,chanStr,finish)
for {
str, err := r.ReadString('\n')
str = strings.TrimRight(str,"\n")
if lines == -1 {lines,_ = strconv.Atoi(str);chanLines<-lines;continue}
go func(chanStr chan []int,str string){
var resultArr = make([]int,101)
arr := strings.Split(str," ")
var num int
for k,val := range arr{
if k==0{continue}
num,_ =strconv.Atoi(val)
resultArr[num]++
}
chanStr<-resultArr
}(chanStr,str)
if err == io.EOF{
break
}
}
fileOut,_ := os.Create(output)
arr := <- finish
for key,val := range arr{
if val == 0 {continue}
for i:=0;i<val;i++{fileOut.WriteString(strconv.Itoa(key)+" ")}
}
}
func mergeArray(chanLines chan int, chanStr chan []int, finish chan []int){
var lines = <- chanLines
var count int
var lastArr []int
var secondArr bool
LOOP:
for arr := range chanStr{
if lines-1 == count {
finish <- arr
break LOOP
}
if !secondArr{
lastArr = arr
secondArr = !secondArr
} else {
go Merge(lastArr,arr,chanStr)
secondArr = !secondArr
count++
}
}
}
func Merge(arr1 []int,arr2[]int,chanStr chan []int){
for k := range arr1{
arr1[k] = arr1[k]+arr2[k]
}
chanStr <- arr1
}
Если переписать на синхронную модель данный алгоритм, то он спокойно доходит до 20 теста и там уже ему не хватает времени (Выполняется более 1 секунды)
Подскажите в чем может быть проблема, и какие нюансы я упускаю