2026-rff_mp/stepushovgs/data-structures/source/tests/test_ll/main.go
GordStep 4a214a2843 Изменение иерархии
- добавеление в отлсеживание go.mod
 - перенос хеш таблицы на общий формат хранения данных
 - удаление лишних
2026-05-10 12:30:21 +03:00

178 lines
4.3 KiB
Go

package main
import (
"bufio"
"fmt"
"math/rand"
"os"
dg "source/pkg/gen_data"
rs "source/pkg/resulter"
ll "source/pkg/structures/linked_list"
"time"
)
const (
countUsers = 10000
countRepeat = 5
countRandomSearch = 10000
countNotExitstSearch = 10
countDeletes = 50
)
func isInArr(arr []int, length int, target int) bool {
for i := 0; i < length; i++ {
if arr[i] == target {
return true
}
}
return false
}
func Razdelitel() {
for i := 0; i < 20; i++ {
fmt.Print("-")
}
fmt.Println()
}
func pressEnterToContinue() {
fmt.Print("Нажмите Enter для продолжения...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func main() {
fmt.Println("hello world!")
results := make([]rs.BenchmarkResult, 0, countUsers)
averageInsertTime := 0.
Razdelitel()
fmt.Println("Тестирование вставки:")
var head *ll.LinkedList = nil
for testNum := 0; testNum < countRepeat; testNum++ {
head = nil
testData := dg.RecordsShuffled(countUsers)
start := time.Now()
for i := 0; i < countUsers; i++ {
head.Insert(testData[i])
}
elapsed := time.Since(start).Seconds()
averageInsertTime += elapsed
results = append(results, rs.BenchmarkResult{
Structure: "Связный список", Mode: "Случайный", Operation: "Вставка", Time: elapsed,
})
}
averageInsertTime /= countRepeat
results = append(results, rs.BenchmarkResult{
Structure: "Связный список", Mode: "Случайный", Operation: "Вставка", Time: averageInsertTime,
})
for i := 0; i < 6; i++ {
fmt.Println(results[i].ToString())
}
Razdelitel()
// fmt.Println("Тестирование Поиска:")
// // results = make([]rs.BenchmarkResult, 0, countUsers)
// averageSearchTime := 0.
// for testNum := 0; testNum < countRepeat; testNum++ {
// // var head *ll.LinkedList = nil
// // head = dg.RecordsShuffled(countUsers)
// testData := make([]ds.MyData, countRandomSearch)
// for i := 0; i < countRandomSearch; i++ {
// // randInd := rand.Intn(countUsers)
// randInd := rand.Intn(1000) + 9000
// testData[i], _ = head.GetByInd(randInd)
// // fmt.Println(randInd)
// }
// start := time.Now()
// for i := 0; i < countRandomSearch; i++ {
// head.Search(testData[i].Name)
// }
// elapsed := time.Since(start).Seconds()
// averageSearchTime += elapsed
// results = append(results, rs.BenchmarkResult{
// Structure: "Связный список", Mode: "Случайный", Operation: "Поиск", Time: elapsed,
// })
// }
// averageSearchTime /= countRepeat
// results = append(results, rs.BenchmarkResult{
// Structure: "Связный список", Mode: "Случайный", Operation: "Поиск", Time: averageSearchTime,
// })
// for i := 0; i < len(results); i++ {
// fmt.Println(results[i].ToString())
// }
resultsS := runSearchBenchmark(head)
for i := 0; i < len(resultsS); i++ {
fmt.Println(resultsS[i].ToString())
}
// rs.AppendRaw(results)
}
func runSearchBenchmark(head *ll.LinkedList) []rs.BenchmarkResult {
fmt.Println("\n=== Тестирование Поиска ===")
const countRandomSearch = 1000 // уменьшим для поиска
var results []rs.BenchmarkResult
var totalTime float64
// Предварительно собираем имена для поиска
names := make([]string, countUsers)
for i := 0; i < countUsers; i++ {
data, found := head.GetByInd(i)
if found {
names[i] = data.Name
}
}
for testNum := 0; testNum < countRepeat; testNum++ {
// Выбираем случайные имена
searchNames := make([]string, countRandomSearch)
for i := 0; i < countRandomSearch; i++ {
searchNames[i] = names[rand.Intn(countUsers)]
}
start := time.Now()
for _, name := range searchNames {
el, ok := head.Search(name)
if ok {
fmt.Println(el)
}
}
elapsed := time.Since(start).Seconds()
totalTime += elapsed
fmt.Printf(" Тест %d: %.6f сек (%.2f мкс/оп)\n",
testNum+1, elapsed,
elapsed/float64(countRandomSearch)*1_000_000)
}
avgTime := totalTime / float64(countRepeat)
fmt.Printf("Среднее: %.6f сек\n", avgTime)
results = append(results, rs.BenchmarkResult{
Structure: "Связный список",
Mode: "Случайный",
Operation: "Поиск",
Time: avgTime,
})
return results
}